geotrellis使用(二十四)将Geotrellis移植到CDH中必须要填的若干个坑
目录
一、前言
近期干了一件事情,将geotrellis程序移植到CDH中(关于CDH,可以参考安装ClouderaManager以及使用ClouderaManager安装分布式集群的若干细节),本以为这是件很简单的事情,没想到跟安装CDH一样却碰到了许多的坑,很多事情真的就是这样,我们不去亲自实践觉得都是简单的,当我们真正甩开膀子去干的时候却发现会遇到各种各样的问题,但是当我们将这些一个个解决的时候,你收获的将不仅是美好的结果,更是很多通过学习无法得到的东西,这应该就是古人所谓的纸上得来终觉浅。鸡汤不多喝,直接进入正题。
二、若干坑
2.1 spark-submit部署模式
CDH中的spark完全采用yarn的模式部署,即将任务调度等提交到yarn,完全由yarn来控制程序的运行。目前还没发现这方面有什么问题,主要就是如果之前采用local模式或者其他模式此处可能稍有不同,需要注意。
2.2 akka与spray
这是我碰到的第一个问题,当运行service主程序的时候立马会报如下错误:
java.lang.AbstractMethodError: com.sjzx.spray.can.HttpManager.akka$actor$ActorLogging$_setter_$log_$eq(Lakka/event/LoggingAdapter;)V
at akka.actor.ActorLogging$class.$init$(Actor.scala:335)
at com.sjzx.spray.can.HttpManager.<init>(HttpManager.scala:29)
at com.sjzx.spray.can.HttpExt$$anonfun$1.apply(Http.scala:153)
at com.sjzx.spray.can.HttpExt$$anonfun$1.apply(Http.scala:153)
at akka.actor.TypedCreatorFunctionConsumer.produce(Props.scala:401)
at akka.actor.Props.newActor(Props.scala:339)
at akka.actor.ActorCell.newActor(ActorCell.scala:534)
at akka.actor.ActorCell.create(ActorCell.scala:560)
at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:425)
at akka.actor.ActorCell.systemInvoke(ActorCell.scala:447)
at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:262)
at akka.dispatch.Mailbox.run(Mailbox.scala:218)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
上来就让人蒙圈,毫无头绪,根本不知道什么问题,经过苦苦探索以及Google等,才明白过来是spray和akka的版本问题,然后试验了各种办法,最终通过降低版本的方式勉强解决了这个问题,有人说通过ShadeRule的方式也可以,但是我没能成功,如果有人通过这种方式成功解决这个问题,欢迎指教。降低版本后的sbt依赖如下:
"io.spray" % "spray-routing" % "1.2.3",
"io.spray" % "spray-can" % "1.2.3",
造成这个问题的原因应该是spray与cloudera运行时classpath中的某个库冲突了,通过以上方式应该能解决这个问题,解决了这个问题后就可以正常发起WEB服务运行我们的APP。
2.3 guava
geotrellis毕竟是一个大数据(主要是栅格)处理的工具,那么当然少不了数据,所以APP运行起来之后,开始导数据,然后就又蒙圈了,又会报一个方法找不到的错误。导数据的时候由于参数采用了json文件进行配置,所以geotrellis会进行json校验,就是这个时候出问题了,geotrellis采用了google开源的工具库com.google.guava,就是这个库由冲突了造成的,这个倒是可以用ShadeRule的方式解决,只需要在build.sbtz文件中添加如下代码:
assemblyShadeRules in assembly := {
Seq(
ShadeRule.rename("com.google.common.**" -> "my.google.common.@1")
.inLibrary(
"com.azavea.geotrellis" %% "geotrellis-cassandra" % gtVersion,
"com.github.fge" % "json-schema-validator" % "2.2.6"
).inAll
}
2.4 spark-core、hadoop-client
CDH毕竟是采用修改后的HADOOP以及SPARK,所以为了安全起见,需要将原始的库替换成CDH对应版本,具体为将二者的依赖改成如下方式:
resolvers += "cloudera" at "https://repository.cloudera.com/artifactory/cloudera-repos"
val sparkV = "1.6.0-cdh5.8.0"
"org.apache.spark" %% "spark-core" % sparkV % "provided"
"org.apache.hadoop" % "hadoop-client" % "2.7.1" % "provided"
通过以上方式可以加载CDH版本的HADOOP以及SPARK,并且添加"provided"可以使得我们的APP直接调用CDH提供的对应版本。
2.5 hdfs权限
这也是一个大坑,当解决了上面的问题之后满心欢喜以为就能进行数据处理了,谁知道程序死活就是不往下走,而且不报任何错误(不知道是不是我设置的有问题,当然刚开始也没看CDH运行的日志文件,不然应该也较快的解决了,日志文件在/var/log/accumulo中),反复检查Accumulo配置等等,均没有问题,最后使出了一个大招,程序加了个try catch,果然出现问题了,一看就是hdfs权限的问题。首先我装cloudera的时候选择的是多用户模式,我猜测出现权限问题可能也跟多用户有关系。反复实验了各种方式都没能解决问题,最终我解决权限问题的方式是将hdfs的umask设置为0000,这样使得一个用户创建的文件以及文件夹可以被其他用户操作,通过这种方式解决了问题,最终顺利将数据导入到Accumulo种。
三、总结
本文为大家介绍了我在将geotrellis程序部署到CDH中遇到的几个问题及解决方案,看似简单的几句话的事情,其实足足折腾了好几天。而且每个人由于实际配置版本等不同,在部署的过程中可能会遇到这些问题,也可能会遇到新的问题。总之,只要你能够自己折腾那么一番不管结果如何,一定会在过程中学到很多东西。
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html
geotrellis使用(二十四)将Geotrellis移植到CDH中必须要填的若干个坑的更多相关文章
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
- 二十四、Struts2中的UI标签
二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...
- VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机
VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...
- Bootstrap入门(二十四)data属性
Bootstrap入门(二十四)data属性 你可以仅仅通过 data 属性 API 就能使用所有的 Bootstrap 插件,无需写一行 JavaScript 代码.这是 Bootstrap 中的一 ...
- 3360: [Usaco2004 Jan]算二十四
3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6 Solved: 6[Submit][Statu ...
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...
- 二十四. Python基础(24)--封装
二十四. Python基础(24)--封装 ● 知识结构 ● 类属性和__slots__属性 class Student(object): grade = 3 # 也可以写在__slots ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
随机推荐
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- socket读写返回值的处理
在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- 一看就懂的ReactJs入门教程-精华版
现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...
- java中servlet的各种路径
1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...
- pt-pmp
pt-pmp有两方面的作用:一是获取进程的堆栈信息,二是对这些堆栈信息进行汇总. 进程的堆栈信息是利用gdb获取的,所以在获取的过程中,会对mysql服务端的性能有一定的影响. 用官方的话说: Thi ...
- 普通程序员如何转向AI方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
- 简析服务端通过GT导入SHP至PG的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...
- PHP好用但又容易忽略的小知识
1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...
- 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...