Error through remote Spark Job: java.lang.IllegalAccessError: class org.apache.hadoop.hdfs.web.HftpFileSystem
Error through remote Spark Job: java.lang.IllegalAccessError: class org.apache.hadoop.hdfs.web.HftpFileSystem
问题
我正在尝试 运行 通过 IntelliJ 使用 Spark HDInsight 集群 (HDI 4.0) 进行远程 Spark 作业。在我的 Spark 应用程序中,我尝试使用 Spark 内置的结构化流 readStream
函数从 Azure blob 存储的镶木地板文件文件夹中读取输入流。
当我 运行 它在连接到 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版本冲突导致的。该应用程序 运行 带有为 Hadoop 2.7
预构建的 Spark 2.4
。
修复
为了解决这个问题,我通过 ssh 进入集群的每个头节点和工作节点,并手动将 Hadoop 依赖项从 3.1.x
降级到 2.7.3
以匹配我本地 spark/jars
中的版本文件夹。这样做之后,我就可以成功部署我的应用程序了。从 HDI 4.0 降级集群不是一个选项,因为它是唯一可以支持 Spark 2.4
.
的集群
总结
总而言之,问题可能是我使用的是为 Hadoop 2.7
预构建的 Spark 下载吗?有没有更好的方法来解决这个冲突,而不是手动降级集群节点上的 Hadoop 版本或更改我正在使用的 Spark 版本?
在对我以前尝试过的一些方法进行故障排除后,我遇到了以下修复:
在我的 pom.xml
中,我排除了由 spark-core
jar 自动导入的 hadoop-client
依赖项。此依赖项是版本 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 配置存在问题。根据 this 文章的建议,我将 C://winutils/bin
下的 winutils.exe
版本修改为我需要的版本,并添加了相应的 hadoop.dll
。进行这些更改后,我能够按预期成功地从 blob 存储中读取数据。
TLDR
问题是自动导入的 hadoop-client
依赖项已通过排除它并在 C://winutils/bin
.
下添加新的 winutils.exe
和 hadoop.dll
来修复
这不再需要在 HDInsight 集群中降级 Hadoop 版本或更改我下载的 Spark 版本。
问题:
当 运行 fat jar with hadoop 2.7 和 spark 2.4 on cluster with hadoop 3.x 时,我遇到了同样的问题,
我正在使用 maven 阴影插件。
观察:
在构建 fat jar 时,它包括 jar org.apache.hadoop:hadoop-hdfs:jar:2.6.5 其中有 class class org.apache.hadoop.hdfs.web.HftpFileSystem。
这在 hadoop 3
中引起了问题
解法:
我在构建 fat jar 时排除了这个 jar,因为 below.Issue 得到了解决。
问题
我正在尝试 运行 通过 IntelliJ 使用 Spark HDInsight 集群 (HDI 4.0) 进行远程 Spark 作业。在我的 Spark 应用程序中,我尝试使用 Spark 内置的结构化流 readStream
函数从 Azure blob 存储的镶木地板文件文件夹中读取输入流。
当我 运行 它在连接到 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版本冲突导致的。该应用程序 运行 带有为 Hadoop 2.7
预构建的 Spark 2.4
。
修复
为了解决这个问题,我通过 ssh 进入集群的每个头节点和工作节点,并手动将 Hadoop 依赖项从 3.1.x
降级到 2.7.3
以匹配我本地 spark/jars
中的版本文件夹。这样做之后,我就可以成功部署我的应用程序了。从 HDI 4.0 降级集群不是一个选项,因为它是唯一可以支持 Spark 2.4
.
总结
总而言之,问题可能是我使用的是为 Hadoop 2.7
预构建的 Spark 下载吗?有没有更好的方法来解决这个冲突,而不是手动降级集群节点上的 Hadoop 版本或更改我正在使用的 Spark 版本?
在对我以前尝试过的一些方法进行故障排除后,我遇到了以下修复:
在我的 pom.xml
中,我排除了由 spark-core
jar 自动导入的 hadoop-client
依赖项。此依赖项是版本 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 配置存在问题。根据 this 文章的建议,我将 C://winutils/bin
下的 winutils.exe
版本修改为我需要的版本,并添加了相应的 hadoop.dll
。进行这些更改后,我能够按预期成功地从 blob 存储中读取数据。
TLDR
问题是自动导入的 hadoop-client
依赖项已通过排除它并在 C://winutils/bin
.
winutils.exe
和 hadoop.dll
来修复
这不再需要在 HDInsight 集群中降级 Hadoop 版本或更改我下载的 Spark 版本。
问题: 当 运行 fat jar with hadoop 2.7 和 spark 2.4 on cluster with hadoop 3.x 时,我遇到了同样的问题, 我正在使用 maven 阴影插件。
观察: 在构建 fat jar 时,它包括 jar org.apache.hadoop:hadoop-hdfs:jar:2.6.5 其中有 class class org.apache.hadoop.hdfs.web.HftpFileSystem。 这在 hadoop 3
中引起了问题解法: 我在构建 fat jar 时排除了这个 jar,因为 below.Issue 得到了解决。