我使用Spark v1.6.1和Hive v1.2.x與Python v2.7爲什麼從Hive讀取失敗,出現「java.lang.ClassNotFoundException:Class org.apache.hadoop.fs.s3a.S3AFileSystem not found」?
對於Hive,我有一些表(ORC文件)存儲在HDFS中,一些存儲在S3中。如果我們試圖加入兩個表,其中一個在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
筆記本的邊緣節點(已經有火花,hadoop的,蜂巢,TEZ,等...設置/配置)執行。對於Python v2.7,Python環境由conda
管理。 Jupyter從pyspark
開始如下。
IPYTHON_OPTS="notebook --port 7005 --notebook-dir='~/' --ip='*' --no-browser" \
pyspark \
--queue default \
--master yarn-client
當我去星火應用程序UI Environment
下,以下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
你如何執行片段?什麼是CLASSPATH? –
只需在執行+環境+類路徑中添加更多信息即可。 –