我使用Spark v1.6.1和Hive v1.2.x与Python v2.7
对于Hive,我有一些表(ORC文件)存储在HDFS中,一些存储在S3中 . 如果我们尝试连接2个表,其中一个在HDFS中,另一个在S3中,则抛出 java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
.
例如,这在查询HDFS中的HIVE表时有效 .
df1 = sqlContext.sql('select * from hdfs_db.tbl1')
这在S3中查询HIVE表时有效 .
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,因此这就是存储支持HIVE表(基本上是HDFS和S3中的ORC文件)存在差异的原因 . 一个有趣的事情是,如果我们使用 DBeaver
或 beeline
客户端连接到Hive并发出连接查询,它就可以工作 . 我也可以使用 sqlalchemy
发出连接查询并获得结果 . 此问题仅在Spark的sqlContext上显示 .
有关执行和环境的更多信息:此代码在 Jupyter
笔记本上的边缘节点上执行(已经有spark,hadoop,hive,tez等...设置/配置) . 对于Python v2.7,Python环境由 conda
管理 . Jupyter以 pyspark
开头如下 .
IPYTHON_OPTS="notebook --port 7005 --notebook-dir='~/' --ip='*' --no-browser" \
pyspark \
--queue default \
--master yarn-client
当我转到 Environment
下的Spark应用程序UI时,以下 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-client / 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
1 回答
从SPARK-15965 No FileSystem for scheme: s3n or s3a spark-2.0.0 and spark-1.6.1引用Steve Loughran(谁在Spark开发中给出了他的跟踪记录似乎是关于访问S3文件系统主题的真相来源):
还有一些其他来源,您可以找到解决方法:
https://issues.apache.org/jira/browse/SPARK-7442
https://community.mapr.com/thread/9635
How to access s3a:// files from Apache Spark?
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支持的当前情况 . 谢谢 .