1

我将 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则会抛出 a。

例如,这在查询 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 环境由condaPython v2.7 管理。Jupyter 的启动pyspark方式如下。

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

当我转到下的 Spark 应用程序 UIEnvironment时,以下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

4

1 回答 1

1

引用来自SPARK-15965 No FileSystem for scheme: s3n or s3a spark-2.0.0 and spark-1.6 Steve Loughran(他在 Spark 开发方面的记录似乎是有关访问 S3 文件系统主题的真相的来源).1

我在 SPARK-7481 的工作中通过测试解决了这个问题;手动解决方法是

Spark 1.6+ 这需要我的补丁重建火花组件。但是,一旦该补丁进入,尝试使用没有 AWS JAR 的程序集将阻止 spark 启动 - 除非您升级到 Hadoop 2.7.3

还有一些其他来源可以找到解决方法:

我没有环境(和经验)来尝试上述方法,因此在您尝试上述方法后,请返回报告以更好地了解 Spark 中有关 S3 支持的当前情况。谢谢。

于 2017-05-18T19:35:57.523 回答