找不到:org.apache.hadoop.security.authentication.util.KerberosUtil

时间:2018-07-05 08:57:55

标签: hadoop apache-kafka apache-storm

我正在集群中运行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

Click here to view POM file

经过一些Google搜索后,我发现我们已经添加了hadoop auth jar。即使我发现了相同的错误

1 个答案:

答案 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>