我正在集群中运行Storm jar,在其中配置了hadoop,kafka,storm集群
当我在本地模式下运行jar时,它运行良好,当我在Storm集群上运行它时,我在Storm 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
经过一些Google搜索后,我发现我们已经添加了hadoop auth jar。即使我发现了相同的错误
答案 0 :(得分:1)
我认为您正在包装一个旧的Hadoop jar。
看看storm-hdfs POM https://github.com/apache/storm/blob/v1.0.6/external/storm-hdfs/pom.xml。当您使用Shade插件时,最终得到的jar将包含您的所有依赖关系,包括通过直接依赖关系引入的可传递依赖关系。 Storm-hdfs声明对Hadoop jar列表的依赖。如果要使用默认版本以外的其他版本的Hadoop,则需要确保在POM中声明了相同的Hadoop jar列表。
具体情况是,您没有在POM中声明hadoop-auth,因此POM与该jar的默认版本(2.6.1)打包在一起。由于该版本的hadoop-auth与其他Hadoop jar(2.9.1)不兼容,因此在运行时会出现异常。
您应该从导入的storm-hdfs中排除所有Hadoop jar,然后将要使用的jar放入Storm的lib目录中,或者将正确版本的Hadoop jar添加到POM中的依赖项列表中。
编辑: 我想我找到了你的问题。您尚未将Storm-core的范围设置为提供。由于storm-core取决于hadoop-auth,并且您尚未明确声明,因此Maven将尝试根据依赖关系在树中的位置来猜测所需的hadoop-auth版本。由于hadoop-auth在某些Hadoop依赖项中显示为2.9.1,而在Storm-core中显示为2.6.1,因此您碰巧将2.6.1放入了jar。
如果将来想避免这种情况,则应使用Maven的dependencyManagement块https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management。
即您应该在pom中添加如下所示的内容,然后删除hadoop jar的排除项。
<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>