问题
我正试图通过intellij和spark hdinsight cluster(hdi4.0)运行一个远程spark作业。在我的spark应用程序中,我尝试使用spark内置的结构化流从azure blob存储中的Parquet文件文件夹读取输入流 readStream
功能。
当我在连接到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之间的版本冲突造成的。应用程序使用spark运行 2.4
为hadoop预构建 2.7
.
修复
为了解决这个问题,我使用ssh连接到集群的每个head和worker节点,并手动将hadoop依赖关系降级为 2.7.3
从 3.1.x
以匹配本地版本 spark/jars
文件夹。这样做之后,我就可以成功地部署我的应用程序了。将集群从hdi4.0降级不是一个选项,因为它是唯一一个支持spark的集群 2.4
.
摘要
总而言之,问题是我使用的是为hadoop预先构建的spark下载吗 2.7
? 有没有更好的方法来解决这个冲突,而不是手动降级集群节点上的hadoop版本或更改我正在使用的spark版本?
2条答案
按热度按时间s2j5cfk01#
在对以前尝试的一些方法进行故障排除之后,我遇到了以下修复:
在我的
pom.xml
我排除了hadoop-client
依赖项由spark-core
jar。此依赖关系的版本为2.6.5
与集群版本的hadoop冲突。相反,我导入所需的版本。在进行此更改之后,我遇到了错误
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版本。
to94eoyn2#
问题:在hadoop3.x集群上运行hadoop2.7和spark2.4的fatjar时,我遇到了同样的问题,我使用的是maven shade插件。
观察:在构建fatjar时,它包含jar org.apache。hadoop:hadoop-hdfs:jar:2.6.5 which 有org.apache.hadoop.hdfs.web.hftpfilesystem类。这在hadoop3中引起了问题
解决方案:我在构建fat jar时排除了这个jar,如下所示。