1

我使用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文件)的差異。一個有趣的事情是,如果我們使用DBeaverbeeline客戶端連接到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

+0

你如何執行片段?什麼是CLASSPATH? –

+0

只需在執行+環境+類路徑中添加更多信息即可。 –

回答

1

報價Steve Loughran(誰給他的紀錄在星火發展似乎是有關訪問S3文件系統的話題真理的來源)從SPARK-15965 No FileSystem for scheme: s3n or s3a spark-2.0.0 and spark-1.6.1

這正在SPARK-7481工作中的測試中修復;手冊 解決方法是

Spark 1.6+ 這需要我的補丁重建火花組件。然而,一旦該修補程序是,欲以大會沒有AWS JAR文件將開始停止火花-unless你向上移動到Hadoop的2.7.3

也有一些其他的來源,你可以找到解決方法:

等你以後給上面的一個嘗試,請彙報有關於星火S3支持更好地瞭解目前的情況我沒有環境(和經驗),得到一個鏡頭上方。謝謝。

+1

我喜歡認爲自己是「一致的主張的來源」而不是真實:後者僅由測試持有。火花hadoop-cloud模塊在Spark 2.3中,因此所有使用-Phadoop-cloud的build都沒有設置。對於Spark 1.6,您需要在CP上使用hadoop-aws和amazon-s3-sdk的匹配版本。我不知道CDH在那裏做什麼,對不起。 –

相關問題