Storm-HDFS整合过程中问题解决
2015-11-13 17:29
741 查看
前面提到了部署Hadoop的集群环境,因为我们需要用到HDFS,将Storm过来的数据离线存入到HDFS中,然后使用Hadoop从HDFS中取数据进行分析处理。
于是乎我们需要整合Storm-HDFS,在整合过程中遇到了许多问题,有的问题可以在网上找到,但是解决方法不一定实用,于是这里分享出来,以便自己学习,同时也为同样遇到相同问题处于困惑中的伙伴提供解决方法。
首先, 整合Storm-HDFS,需要编写拓扑结构(topology),然后放到Strom上去运行,这里源代码,我参考的是http://shiyanjun.cn/archives/934.html
然后我打包部署到Storm上去,部署倒是成功了,可以查看Storm的ui发现报错了,于是查询从机日志发现报如下错误:
看这个报错的意思,大概是没有Hdfs的文件系统,看到这个,一开始我还以为是我的Hadoop集群部署的问题,导致HDFS文件系统启动的时候有问题,我还检查了半天,后面我发现Hadoop集群部署没有问题,排出了集群部署的问题,于是我在网上搜寻了好久,后面终于找到了一个解决方案:https://github.com/ptgoetz/storm-hdfs
这里面说的是:
我们在打包拓扑结构(topology)的时候,使用的是maven-assembly-plugin这个maven插件,因为我们需要把相关的依赖包都打进去,但是这种打包方式会对META-INF 中的同名文件采取覆盖的方式,于是打包后运行会出问题,于是给了解决办法,使用maven-shade-plugin打包:
打包完毕后,本以为问题能彻底解决了,但是,天注定没有那么顺利,这个时候部署的时候又报错误了:
这里纠结了半天,没有添加maven-shade-plugin的时候还能顺利部署,添加后,直接部署的时候就报错了,找了半天原因,发现还是打包的问题
因为我们这里使用了maven-shade-plugin插件进行打包,这里打包的时候会对META-INF 目录下的文件以追加的方式进行打包,所以会导致打包后的 META-INF 目录多出了一些 *.SF,从而导致包重复引用,因而报错:java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
解决办法:
pom文件中继续添加(详情可以参考:/article/2585852.html):
添加这个以后,问题解决。
这次打包部署,部署成功,但是老天总是这么折腾人,查看Storm的ui发现又报错了,然后进入从机日志查看详细报错信息:
一开始,完全不知道这个错误是什么鬼,然后再网上查了查,有人说报这个错误是缺少hadoop-auth这个jar包,详情可参考:http://stackoverflow.com/questions/22278620/the-ibm-java-error-for-running-jobs-in-hadoop-2-2-0
于是在pom.xml引入了这个包(这里包的版本只有1.x和2.x会有影响,Storm中引入的hadoop是2.x的版本的话,这个包也必须要2.x的版本,这里我引入的是2.7.1的):
原以为问题该解决了吧,可是发现报错更多了,不只是之前的那个错误还在,又多了一个错误:
于是又找原因,网上搜索了半天,说是log4j和slf4j-log4j12包冲突的问题,详情见:http://erichua.iteye.com/blog/1182090
于是修改pom文件,在刚加的hadoop-auth包中去除slf4j-log4j12依赖,如下:
于是乎我们需要整合Storm-HDFS,在整合过程中遇到了许多问题,有的问题可以在网上找到,但是解决方法不一定实用,于是这里分享出来,以便自己学习,同时也为同样遇到相同问题处于困惑中的伙伴提供解决方法。
首先, 整合Storm-HDFS,需要编写拓扑结构(topology),然后放到Strom上去运行,这里源代码,我参考的是http://shiyanjun.cn/archives/934.html
然后我打包部署到Storm上去,部署倒是成功了,可以查看Storm的ui发现报错了,于是查询从机日志发现报如下错误:
2015-11-13T15:58:13.119+0800 b.s.util [ERROR] Async loop died! java.lang.RuntimeException: Error preparing HdfsBolt: No FileSystem for scheme: hdfs at org.apache.storm.hdfs.bolt.AbstractHdfsBolt.prepare(AbstractHdfsBolt.java:109) ~[stormjar.jar:na] at backtype.storm.daemon.executor$fn__4722$fn__4734.invoke(executor.clj:692) ~[storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:461) ~[storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71] Caused by: java.io.IOException: No FileSystem for scheme: hdfs at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367) ~[stormjar.jar:na] at org.apache.storm.hdfs.bolt.HdfsBolt.doPrepare(HdfsBolt.java:86) ~[stormjar.jar:na] at org.apache.storm.hdfs.bolt.AbstractHdfsBolt.prepare(AbstractHdfsBolt.java:105) ~[stormjar.jar:na] ... 4 common frames omitted 2015-11-13T15:58:13.120+0800 b.s.d.executor [ERROR] java.lang.RuntimeException: Error preparing HdfsBolt: No FileSystem for scheme: hdfs at org.apache.storm.hdfs.bolt.AbstractHdfsBolt.prepare(AbstractHdfsBolt.java:109) ~[stormjar.jar:na] at backtype.storm.daemon.executor$fn__4722$fn__4734.invoke(executor.clj:692) ~[storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:461) ~[storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71] Caused by: java.io.IOException: No FileSystem for scheme: hdfs at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449) ~[stormjar.jar:na] at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367) ~[stormjar.jar:na] at org.apache.storm.hdfs.bolt.HdfsBolt.doPrepare(HdfsBolt.java:86) ~[stormjar.jar:na] at org.apache.storm.hdfs.bolt.AbstractHdfsBolt.prepare(AbstractHdfsBolt.java:105) ~[stormjar.jar:na] ... 4 common frames omitted 2015-11-13T15:58:13.194+0800 b.s.util [ERROR] Halting process: ("Worker died") java.lang.RuntimeException: ("Worker died") at backtype.storm.util$exit_process_BANG_.doInvoke(util.clj:325) [storm-core-0.9.4.jar:0.9.4] at clojure.lang.RestFn.invoke(RestFn.java:423) [clojure-1.5.1.jar:na] at backtype.storm.daemon.worker$fn__5102$fn__5103.invoke(worker.clj:495) [storm-core-0.9.4.jar:0.9.4] at backtype.storm.daemon.executor$mk_executor_data$fn__4555$fn__4556.invoke(executor.clj:240) [storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:473) [storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na]
看这个报错的意思,大概是没有Hdfs的文件系统,看到这个,一开始我还以为是我的Hadoop集群部署的问题,导致HDFS文件系统启动的时候有问题,我还检查了半天,后面我发现Hadoop集群部署没有问题,排出了集群部署的问题,于是我在网上搜寻了好久,后面终于找到了一个解决方案:https://github.com/ptgoetz/storm-hdfs
这里面说的是:
我们在打包拓扑结构(topology)的时候,使用的是maven-assembly-plugin这个maven插件,因为我们需要把相关的依赖包都打进去,但是这种打包方式会对META-INF 中的同名文件采取覆盖的方式,于是打包后运行会出问题,于是给了解决办法,使用maven-shade-plugin打包:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.4</version> <configuration> <createDependencyReducedPom>true</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass></mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>然后我将这一段打包的代码添加到了pom.xml中,这里注意<mainClass></mainClass>中间加你的main方法的路径
打包完毕后,本以为问题能彻底解决了,但是,天注定没有那么顺利,这个时候部署的时候又报错误了:
Exception in thread "main" java.lang.ExceptionInInitializerError at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:191) at backtype.storm.config__init.__init5(Unknown Source) at backtype.storm.config__init.<clinit>(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:274) at clojure.lang.RT.loadClassForName(RT.java:2098) at clojure.lang.RT.load(RT.java:430) at clojure.lang.RT.load(RT.java:411) at clojure.core$load$fn__5018.invoke(core.clj:5530) at clojure.core$load.doInvoke(core.clj:5529) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5336) at clojure.core$load_lib$fn__4967.invoke(core.clj:5375) at clojure.core$load_lib.doInvoke(core.clj:5374) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invoke(core.clj:619) at clojure.core$load_libs.doInvoke(core.clj:5417) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:621) at clojure.core$use.doInvoke(core.clj:5507) at clojure.lang.RestFn.invoke(RestFn.java:408) at backtype.storm.command.config_value$loading__4910__auto__.invoke(config_value.clj:16) at backtype.storm.command.config_value__init.load(Unknown Source) at backtype.storm.command.config_value__init.<clinit>(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:274) at clojure.lang.RT.loadClassForName(RT.java:2098) at clojure.lang.RT.load(RT.java:430) at clojure.lang.RT.load(RT.java:411) at clojure.core$load$fn__5018.invoke(core.clj:5530) at clojure.core$load.doInvoke(core.clj:5529) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.lang.Var.invoke(Var.java:415) at backtype.storm.command.config_value.<clinit>(Unknown Source) Caused by: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:286) at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:239) at java.util.jar.JarVerifier.processEntry(JarVerifier.java:317) at java.util.jar.JarVerifier.update(JarVerifier.java:228) at java.util.jar.JarFile.initializeVerifier(JarFile.java:348) at java.util.jar.JarFile.getInputStream(JarFile.java:415) at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:775) at sun.misc.Resource.cachedInputStream(Resource.java:77) at sun.misc.Resource.getByteBuffer(Resource.java:160) at java.net.URLClassLoader.defineClass(URLClassLoader.java:436) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at backtype.storm.utils.LocalState.<clinit>(LocalState.java:35) ... 35 more
这里纠结了半天,没有添加maven-shade-plugin的时候还能顺利部署,添加后,直接部署的时候就报错了,找了半天原因,发现还是打包的问题
因为我们这里使用了maven-shade-plugin插件进行打包,这里打包的时候会对META-INF 目录下的文件以追加的方式进行打包,所以会导致打包后的 META-INF 目录多出了一些 *.SF,从而导致包重复引用,因而报错:java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
解决办法:
pom文件中继续添加(详情可以参考:/article/2585852.html):
<span style="white-space:pre"> </span><filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters>
添加这个以后,问题解决。
这次打包部署,部署成功,但是老天总是这么折腾人,查看Storm的ui发现又报错了,然后进入从机日志查看详细报错信息:
java.lang.NoSuchFieldError: IBM_J***A at org.apache.hadoop.security.UserGroupInformation.getOSLoginModuleName(UserGroupInformation.java:303) ~[stormjar.jar:na] at org.apache.hadoop.security.UserGroupInformation.<clinit>(UserGroupInformation.java:348) ~[stormjar.jar:na] at org.apache.storm.hdfs.common.security.HdfsSecurityUtil.login(HdfsSecurityUtil.java:36) ~[stormjar.jar:na] at org.apache.storm.hdfs.bolt.AbstractHdfsBolt.prepare(AbstractHdfsBolt.java:104) ~[stormjar.jar:na] at backtype.storm.daemon.executor$fn__4722$fn__4734.invoke(executor.clj:692) ~[storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:461) ~[storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71] 2015-11-13T16:55:45.732+0800 b.s.d.executor [ERROR] java.lang.NoSuchFieldError: IBM_J***A at org.apache.hadoop.security.UserGroupInformation.getOSLoginModuleName(UserGroupInformation.java:303) ~[stormjar.jar:na] at org.apache.hadoop.security.UserGroupInformation.<clinit>(UserGroupInformation.java:348) ~[stormjar.jar:na] at org.apache.storm.hdfs.common.security.HdfsSecurityUtil.login(HdfsSecurityUtil.java:36) ~[stormjar.jar:na] at org.apache.storm.hdfs.bolt.AbstractHdfsBolt.prepare(AbstractHdfsBolt.java:104) ~[stormjar.jar:na] at backtype.storm.daemon.executor$fn__4722$fn__4734.invoke(executor.clj:692) ~[storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:461) ~[storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71] 2015-11-13T16:55:45.823+0800 b.s.util [ERROR] Halting process: ("Worker died") java.lang.RuntimeException: ("Worker died") at backtype.storm.util$exit_process_BANG_.doInvoke(util.clj:325) [storm-core-0.9.4.jar:0.9.4] at clojure.lang.RestFn.invoke(RestFn.java:423) [clojure-1.5.1.jar:na] at backtype.storm.daemon.worker$fn__5102$fn__5103.invoke(worker.clj:495) [storm-core-0.9.4.jar:0.9.4] at backtype.storm.daemon.executor$mk_executor_data$fn__4555$fn__4556.invoke(executor.clj:240) [storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:473) [storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]
一开始,完全不知道这个错误是什么鬼,然后再网上查了查,有人说报这个错误是缺少hadoop-auth这个jar包,详情可参考:http://stackoverflow.com/questions/22278620/the-ibm-java-error-for-running-jobs-in-hadoop-2-2-0
于是在pom.xml引入了这个包(这里包的版本只有1.x和2.x会有影响,Storm中引入的hadoop是2.x的版本的话,这个包也必须要2.x的版本,这里我引入的是2.7.1的):
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-auth</artifactId> <version>2.7.1</version> </dependency>
原以为问题该解决了吧,可是发现报错更多了,不只是之前的那个错误还在,又多了一个错误:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory at org.apache.log4j.Logger.getLogger(Logger.java:39) ~[log4j-over-slf4j-1.6.6.jar:1.6.6] at kafka.utils.Logging$class.logger(Logging.scala:24) ~[stormjar.jar:na] at kafka.network.BlockingChannel.logger$lzycompute(BlockingChannel.scala:35) ~[stormjar.jar:na] at kafka.network.BlockingChannel.logger(BlockingChannel.scala:35) ~[stormjar.jar:na] at kafka.utils.Logging$class.debug(Logging.scala:51) ~[stormjar.jar:na] at kafka.network.BlockingChannel.debug(BlockingChannel.scala:35) ~[stormjar.jar:na] at kafka.network.BlockingChannel.connect(BlockingChannel.scala:64) ~[stormjar.jar:na] at kafka.consumer.SimpleConsumer.connect(SimpleConsumer.scala:44) ~[stormjar.jar:na] at kafka.consumer.SimpleConsumer.getOrMakeConnection(SimpleConsumer.scala:142) ~[stormjar.jar:na] at kafka.consumer.SimpleConsumer.kafka$consumer$SimpleConsumer$$sendRequest(SimpleConsumer.scala:69) ~[stormjar.jar:na] at kafka.consumer.SimpleConsumer.getOffsetsBefore(SimpleConsumer.scala:124) ~[stormjar.jar:na] at kafka.javaapi.consumer.SimpleConsumer.getOffsetsBefore(SimpleConsumer.scala:79) ~[stormjar.jar:na] at storm.kafka.KafkaUtils.getOffset(KafkaUtils.java:77) ~[stormjar.jar:na] at storm.kafka.KafkaUtils.getOffset(KafkaUtils.java:67) ~[stormjar.jar:na] at storm.kafka.PartitionManager.<init>(PartitionManager.java:83) ~[stormjar.jar:na] at storm.kafka.ZkCoordinator.refresh(ZkCoordinator.java:98) ~[stormjar.jar:na] at storm.kafka.ZkCoordinator.getMyManagedPartitions(ZkCoordinator.java:69) ~[stormjar.jar:na] at storm.kafka.KafkaSpout.nextTuple(KafkaSpout.java:135) ~[stormjar.jar:na] at backtype.storm.daemon.executor$fn__4654$fn__4669$fn__4698.invoke(executor.clj:565) ~[storm-core-0.9.4.jar:0.9.4] at backtype.storm.util$async_loop$fn__458.invoke(util.clj:463) ~[storm-core-0.9.4.jar:0.9.4] at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71] 2015-11-13T17:06:50.012+0800 b.s.d.executor [ERROR]
于是又找原因,网上搜索了半天,说是log4j和slf4j-log4j12包冲突的问题,详情见:http://erichua.iteye.com/blog/1182090
于是修改pom文件,在刚加的hadoop-auth包中去除slf4j-log4j12依赖,如下:
<dependency> <span style="white-space:pre"> </span><groupId>org.apache.hadoop</groupId> <artifactId>hadoop-auth</artifactId> <span style="white-space:pre"> </span><version>2.7.1</version> <span style="white-space:pre"> </span><exclusions> <span style="white-space:pre"> </span><exclusion> <span style="white-space:pre"> </span><groupId>org.slf4j</groupId> <span style="white-space:pre"> </span><artifactId>slf4j-log4j12</artifactId> <span style="white-space:pre"> </span></exclusion> </exclusions> </dependency>然后打包部署,果然这个slf4j-log4j12这个包冲突的问题解决了,但是之前的java.lang.NoSuchFieldError: IBM_J***A错误还在,继续寻找原因,后面发现,添加hadoop-auth并没有错,但是在hadoop-auth这个包中的org.apache.hadoop.util.PlatformName中有一个IBM_J***A这个东西需要用到,但是在hadoop-core这个包中也有org.apache.hadoop.util.PlatformName这个类,所以程序运行的时候它会跑到hadoop-core这个里面的org.apache.hadoop.util.PlatformName去寻找IBM_J***A,但是却找不到,所以报错,于是在hadoop-auth中去掉hadoop-core这个包,同时在可能依赖到hadoop-core这个包地方都去掉,所以修改pom.xml文件:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-auth</artifactId> <version>2.7.1</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> </exclusion> </exclusions> </dependency>然后顺利打包,部署上去,终于所有问题解决,真是一把辛酸泪,皇天不负有心人,Storm-HDFS整合完毕。
相关文章推荐
- 经典漫画讲解HDFS原理
- YARN和HDFS的调用方式汇总
- HDFS的客户端编写-重构版
- 存储在HDFS上的文件,存储机制及数据安全性如何保证。
- 启动hadoop Warning: $HADOOP_HOME is deprecated.
- Hadoop+Hbase+Zookeeper(独立)环境搭建
- spark+hive+hdfs windows开发环境配置:
- 通过NFSv3挂载HDFS到本地目录
- hdfs数据压缩方案
- RPC机制与hdfs下载源码剖析
- HDFS的Rebalance介绍
- HDFS上传文件的命令使用
- Hadoop辅助排序样例二
- 最新 Hadoop 视频分享
- 最新 Hadoop 视频分享
- 第119讲:HDFS的配置以及安全高效的HDFS配置最佳实践学习笔记
- Hadoop辅助排序样例一
- hadoop分布式安装及其集群配置笔记
- HDFS数据资源使用量分析以及趋势预测
- hdfs常用API和putMerge功能实现