通过远程 Spark 作业时出错:java.lang.IllegalAccessError: class org.apache.hadoop.hdfs.web.HftpFileSystem

Mar*_*ria 4 hadoop scala apache-spark spark-structured-streaming azure-hdinsight

问题

我正在尝试使用 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 版本?

Mar*_*ria 5

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

在我的例子中,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>
Run Code Online (Sandbox Code Playgroud)

进行此更改后,我遇到了错误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.dllunder来修复C://winutils/bin

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