您的位置:首页 > 大数据 > Hadoop

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发现报错了,于是查询从机日志发现报如下错误:

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整合完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: