scala - 通过远程 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.3
from3.1.x
以匹配我本地spark/jars
文件夹中的版本。这样做之后,我就可以成功部署我的应用程序了。从 HDI 4.0 降级集群不是一种选择,因为它是唯一可以支持 Spark 的集群2.4
。
概括
总而言之,问题可能是我正在使用为 Hadoop 预构建的 Spark 下载2.7
吗?有没有更好的方法来解决这个冲突,而不是手动降级集群节点上的 Hadoop 版本或更改我正在使用的 Spark 版本?
解决方案
在对我之前尝试过的一些以前的方法进行故障排除后,我遇到了以下修复:
在我的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.exe
和hadoop.dll
在C://winutils/bin
.
这不再需要降级 HDInsight 群集中的 Hadoop 版本或更改我下载的 Spark 版本。
推荐阅读
- codenameone - 放置按可用空间宽度缩放的图像
- tensorflow - tensorflowjs_converter 导入元图失败
- reactjs - 失去对钩子函数状态更改的输入焦点
- polymer - 从观察者调用函数时,发生“TypeError ...不是函数”的错误
- javascript - HTML:获取由不同元素组成的文本显示在一行中(链接和文本)
- r - 计算两列的对
- material-ui - 无法获取素材 UI Lab CDN
- javascript - 为什么我的聚合返回重复数据?
- batch-file - 为什么这个bat文件不能正常执行?
- android - Dpad 导航无法在 Appbarlayout 下方的 recyclerview 的电视上工作(recycler view 无法通过 dpad 获得焦点)