首页 > 解决方案 > 未找到:org.apache.hadoop.security.authentication.util.KerberosUtil

问题描述

我在集群中运行storm jar,在那里我配置了hadoop、kafka、storm集群

当我在本地模式下运行 jar 时它工作正常,当我在风暴集群上运行它时,我在 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

点击这里查看POM文件

经过一些谷歌我发现我发现我们已经添加了 hadoop auth jar.even 在我发现同样的错误之后

标签: hadoopapache-kafkaapache-storm

解决方案


我认为您正在打包一个旧的 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 依赖于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>

推荐阅读