首页 > 解决方案 > 通过远程 Spark 作业出错:java.lang.IllegalAccessError: class org.apache.hadoop.hdfs.web.HftpFileSystem

问题描述

问题

我正在尝试通过带有 Spark HDInsight 群集 (HDI 4.0) 的 IntelliJ 运行远程 Spark 作业。在我的 Spark 应用程序中,我试图使用 Spark 的结构化流内置readStream函数从 Azure blob 存储中的 parquet 文件文件夹中读取输入流。

当我在连接到 HDInsight 群集的 Zeppelin 笔记本上运行该代码时,该代码按预期工作。但是,当我将 Spark 应用程序部署到集群时,遇到以下错误:

java.lang.IllegalAccessError: class org.apache.hadoop.hdfs.web.HftpFileSystem cannot access its superinterface org.apache.hadoop.hdfs.web.TokenAspect$TokenManagementDelegator

随后,我无法从 blob 存储中读取任何数据。

网上查到的小资料提示这是Spark和Hadoop版本冲突造成的。2.4该应用程序使用为 Hadoop 预构建的Spark 运行2.7

使固定

为了解决这个问题,我 ssh 到集群的每个头节点和工作节点,并手动将 Hadoop 依赖项降级为2.7.3from3.1.x以匹配我本地spark/jars文件夹中的版本。这样做之后,我就可以成功部署我的应用程序了。从 HDI 4.0 降级集群不是一种选择,因为它是唯一可以支持 Spark 的集群2.4

概括

总而言之,问题可能是我正在使用为 Hadoop 预构建的 Spark 下载2.7吗?有没有更好的方法来解决这个冲突,而不是手动降级集群节点上的 Hadoop 版本或更改我正在使用的 Spark 版本?

标签: scalaapache-sparkhadoopspark-structured-streamingazure-hdinsight

解决方案


在对我之前尝试过的一些以前的方法进行故障排除后,我遇到了以下修复:

在我的pom.xml我排除了jarhadoop-client自动导入的依赖项。spark-core此依赖项是2.6.5与集群的 Hadoop 版本冲突的版本。相反,我导入了我需要的版本。

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version.major}</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.hadoop</groupId>
                    <artifactId>hadoop-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
</dependency>

进行此更改后,我遇到了错误java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0。进一步的研究表明,这是由于我本地机器上的 Hadoop 配置存在问题。根据这篇文章的建议,我将winutils.exe我所拥有的版本修改为C://winutils/bin我需要的版本,并添加了相应的hadoop.dll. 进行这些更改后,我能够按预期成功地从 blob 存储中读取数据。

TLDR 问题是自动导入的hadoop-client依赖项,通过排除它并添加新的winutils.exehadoop.dllC://winutils/bin.

这不再需要降级 HDInsight 群集中的 Hadoop 版本或更改我下载的 Spark 版本。


推荐阅读