为什么从Hive读取失败时出现" java.lang.ClassNotFoundException:未找到类org.apache.hadoop.fs.s3a.S3AFileSystem"?

时间:2017-05-18 19:04:42

标签: apache-spark amazon-s3 hive apache-spark-sql apache-spark-1.6

我使用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文件)存在差异的原因。一个有趣的事情是,如果我们使用DBeaverbeeline客户端连接到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具有以下内容。

  • /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 /电流/ Hadoop的客户端/ CONF /
  • 的/ usr / HDP /电流/火花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 个答案:

答案 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支持的当前情况。感谢。