我使用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应用程序用户界面时,以下Classpath Entries
具有以下内容。
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
答案 0 :(得分:1)
从Steve Loughran引用 SPARK-15965 No FileSystem for scheme: s3n or s3a spark-2.0.0 and spark-1.6.1(他在Spark开发中的跟踪记录似乎是关于访问S3文件系统主题的真相来源):< / p>
我在SPARK-7481的工作中通过测试修正了这个问题。手册 解决方法是
Spark 1.6+ 这需要我的补丁重建火花组件。但是,一旦该补丁进入,尝试在没有AWS JAR的情况下使用该程序集将阻止启动火花 - 无论如何都要升级到Hadoop 2.7.3
还有一些其他来源,您可以找到解决方法:
我没有任何环境(和经验)给出上述内容,所以在您尝试上述操作后请报告回来以便更好地了解Spark中有关S3支持的当前情况。感谢。