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.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>
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.exe
和hadoop.dll
under来修复C://winutils/bin
。
这不再需要降级 HDInsight 群集中的 Hadoop 版本或更改我下载的 Spark 版本。
归档时间: |
|
查看次数: |
9494 次 |
最近记录: |