我将 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 文件)存在差异的原因。一件有趣的事情是,如果我们使用DBeaver
或beeline
客户端连接到 Hive 并发出联合查询,它就可以工作。我也可以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 应用程序 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