我在一个集群,其中我的Hadoop配置,卡夫卡,风暴群集中运行的风暴罐子
当我以本地模式运行它工作正常,当我暴集群上运行的罐子,我发现在暴风UI各自的错误:
java.lang.NoSuchMethodError: org.apache.hadoop.security.authentication.util.KerberosUtil.hasKerberosTicket(Ljavax/security/auth/Subject;)Z at
org.apache.hadoop.security.UserGroupInformation.<init>(UserGroupInformation.java:666) at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:861) at
org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:820)
的pom.xml
点击此处查看POM文件
一些谷歌,我发现后,我发现我们有我发现同样的错误之后添加Hadoop的权威性jar.even
我觉得你的包装一个旧的Hadoop罐子。
看看风暴-HDFS POM https://github.com/apache/storm/blob/v1.0.6/external/storm-hdfs/pom.xml 。 当您使用阴影插件,你最终的罐子将包含所有你的依赖,包括通过直接依赖关系带来的传递者。 风暴HDFS声明Hadoop的罐子名单上的依赖。 你需要确保你正在声明在POM的Hadoop jar文件相同的列表,如果你想使用不同版本的Hadoop从默认。
具体发生了什么事是,你还没有宣布在你的POM Hadoop的权威性,所以你的POM被打包与罐子(2.6.1)的默认版本。 由于Hadoop的权威性的那个版本是与其他Hadoop的瓶子(这是2.9.1)兼容,你在运行时异常。
你应该从您的风暴HDFS的进口排除所有Hadoop的罐子,然后把你要在风暴的lib目录来使用,或增加Hadoop的罐子的正确版本到您的依赖列表中你的POM的罐子。
编辑:我想我找到了你的问题。 您还没有设置风暴核心的范围提供。 由于风暴核心在于Hadoop的身份验证,并且您还没有明确宣布它,Maven会尝试猜你需要根据地方的依赖出现在树,Hadoop的权威性的版本。 由于Hadoop的身份验证通过的风暴核心显示为2.9.1通过你的一些Hadoop的相关性,但是2.6.1,你碰巧得到2.6.1把你的罐子。
如果你想避免这种事情在未来,你应该使用Maven的dependencyManagement块https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management 。
即你应该添加类似以下内容到你的POM,然后取出Hadoop的罐子的排除。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
</dependencyManagement>