为什么从配置单元读取失败并出现“java.lang.classnotfoundexception:class org.apache.hadoop.fs.s3a.s3afilesystem not found”?

yptwkmov  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(1346)

我在pythonv2.7中使用sparkv1.6.1和hivev1.2.x
对于hive,有些表(orc文件)存储在hdfs中,有些存储在s3中。如果我们试图连接两个表,其中一个在hdfs中,另一个在s3中,那么 java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found 被抛出。
例如,在hdfs中对配置单元表进行查询时,这是有效的。

df1 = sqlContext.sql('select * from hdfs_db.tbl1')

当在s3中查询配置单元表时,这一点很有效。

df2 = sqlContext.sql('select * from s3_db.tbl2')

下面的代码抛出上面的 RuntimeException .

sql = """
select *
from hdfs_db.tbl1 a
 join s3_db.tbl2 b on a.id = b.id
"""
df3 = sqlContext.sql(sql)

我们正在从hdfs迁移到s3,这就是为什么存储支持配置单元表(基本上是hdfs和s3中的orc文件)存在差异的原因。有趣的是如果我们用 DBeaver 或者 beeline 客户端连接到配置单元并发出联接查询,它就工作了。我也可以用 sqlalchemy 发出联接查询并获取结果。此问题仅在spark的sqlcontext上显示。
有关执行和环境的更多信息:此代码在 Jupyter 边缘节点上的笔记本(已经有spark、hadoop、hive、tez等了。。。设置/配置)。python环境由 conda 对于python v2.7。jupyter是从 pyspark 如下所示。

IPYTHON_OPTS="notebook --port 7005 --notebook-dir='~/' --ip='*' --no-browser" \
 pyspark \
 --queue default \
 --master yarn-client

当我进入spark应用程序ui时 Environment ,如下 Classpath Entries 具有以下特性。
/usr/hdp/2.4.2.0-258/spark/lib/datanucleus-api-jdo-3.2.6.jar
/usr/hdp/2.4.2.0-258/spark/lib/datanucleus-core-3.2.10.jar
/usr/hdp/2.4.2.0-258/spark/lib/datanucleus-rdbms-3.2.9.jar
/usr/hdp/2.4.2.0-258/spark/lib/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar
/usr/hdp/current/hadoop客户端/conf/
/usr/hdp/current/spark historyserver/conf文件/
这个 sun.boot.class.path 具有以下值: /usr/jdk64/jdk1.8.0_60/jre/lib/resources.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/rt.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/sunrsasign.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/jsse.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/jce.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/charsets.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/jfr.jar:/usr/jdk64/jdk1.8.0_60/jre/classes .
这个 spark.executorEnv.PYTHONPATH 具有以下值: /usr/hdp/2.4.2.0-258/spark/python/lib/py4j-0.9-src.zip:/usr/hdp/2.4.2.0-258/spark/python/:<CPS>{{PWD}}/pyspark.zip<CPS>{{PWD}}/py4j-0.9-src.zip .
hadoop发行版通过cdh: Hadoop 2.7.1.2.4.2.0-258

toe95027

toe950271#

引用steve loughran(他在spark开发方面的记录似乎是访问s3文件系统这一主题的真实来源)的话:spark-15965 no filesystem for scheme:s3n或s3a spark-2.0.0和spark-1.6.1:
这是固定的测试在我的工作在Spark-7481;手动解决方法是
Spark1.6+这需要我的补丁一个重建Spark装配。然而,一旦这个补丁进入,尝试使用没有aws jars的程序集将阻止spark的启动,除非你升级到hadoop2.7.3
您还可以在其他一些资源中找到解决方法:
https://issues.apache.org/jira/browse/spark-7442
https://community.mapr.com/thread/9635
如何从apachespark访问s3a://文件?
https://community.hortonworks.com/articles/36339/spark-s3a-filesystem-client-from-hdp-to-access-s3.html
https://community.hortonworks.com/articles/25523/hdp-240-and-spark-160-connecting-to-aws-s3-buckets.html
我没有环境(和经验)来尝试以上内容,所以在您尝试以上内容之后,请反馈,以便更好地了解spark中s3支持的现状。谢谢。

相关问题