目录

  1. 前言
  2. 若干坑
  3. 总结

一、前言

       近期干了一件事情,将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中必须要填的若干个坑的更多相关文章

  1. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  2. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  3. WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?

    原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...

  4. VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机

    VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...

  5. Bootstrap入门(二十四)data属性

    Bootstrap入门(二十四)data属性 你可以仅仅通过 data 属性 API 就能使用所有的 Bootstrap 插件,无需写一行 JavaScript 代码.这是 Bootstrap 中的一 ...

  6. 3360: [Usaco2004 Jan]算二十四

    3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Statu ...

  7. JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

    JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...

  8. 二十四. Python基础(24)--封装

    二十四. Python基础(24)--封装 ● 知识结构   ● 类属性和__slots__属性 class Student(object):     grade = 3 # 也可以写在__slots ...

  9. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

随机推荐

  1. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  2. 我为什么要写LeetCode的博客?

    # 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...

  3. 我为NET狂官方面试题-数据库篇

    求结果:select "1"? 查找包含"objs"的表?查找包含"o"的数据库? 求今天距离2002年有多少年,多少天? 请用一句SQL获 ...

  4. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  5. Matlab 高脚杯模型切片

    前言:此文为去年我替人做的一个课题,觉得比较简洁,图形也比较美观,因此放在博文里 数据源我放到了百度云盘高脚杯数据源 有兴趣的可以下载数据,跑程序试一下.也可以单独看看代码,看下实现过程. 主函数 % ...

  6. 微信开发 :WeixinPayInfoCollection尚未注册Mch 问题解决

    在使用开源项目 SENPARC.WEIXIN SDK 调用微信支付接口的时候出现了WeixinPayInfoCollection尚未注册Mch,这个问题. 最后地解决方案是: 我这个傻逼忘了在全局Gl ...

  7. C#泛型详解(转)

    初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...

  8. 【夯实PHP基础】nginx php-fpm 输出php错误日志

    本文地址 原文地址 分享提纲: 1.概述 2.解决办法(解决nginx下php-fpm不记录php错误日志) 1. 概述 nginx是一个web服务器,因此nginx的access日志只有对访问页面的 ...

  9. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  10. maven 快照

    大型应用软件一般由多个模块组成,一般它是多个团队开发同一个应用程序的不同模块,这是比较常见的场景.例如,一个团队正在对应用程序的应用程序,用户界面项目(app-ui.jar:1.0) 的前端进行开发, ...