1

Ich verwende Spark v1.6.1 und Hive v1.2.x mit Python v2.7Warum schlägt das Lesen von Hive mit "java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem nicht gefunden" fehl?

Für Hive habe ich einige Tabellen (ORC-Dateien) in HDFS und einige in S3 gespeichert. Wenn wir versuchen, 2 Tabellen zu verbinden, wobei eine in HDFS ist und die andere in S3, wird eine java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found geworfen.

Zum Beispiel funktioniert dies bei der Abfrage gegen eine HIVE-Tabelle in HDFS.

df1 = sqlContext.sql('select * from hdfs_db.tbl1') 

Dies funktioniert bei der Abfrage gegen eine HIVE-Tabelle in S3.

Dieser Code unten löst das obige RuntimeException aus.

sql = """ 
select * 
from hdfs_db.tbl1 a 
join s3_db.tbl2 b on a.id = b.id 
""" 
df3 = sqlContext.sql(sql) 

Wir von HDFS S3 migrieren, und das ist, warum also (im Grunde, ORC-Dateien in HDFS und S3) HIVE Tabellen gibt. Eine Differenz von Sicherungsspeicher Eine interessante Sache ist, dass, wenn wir DBeaver oder die beeline Clients verwenden, um eine Verbindung zu Hive herzustellen und die verbundene Abfrage auszugeben, funktioniert es. Ich kann sqlalchemy auch verwenden, um die verbundene Abfrage auszustellen und Ergebnis zu erhalten. Dieses Problem tritt nur bei Sparks sqlContext auf.

Weitere Informationen zu Ausführung und Umgebung: Dieser Code wird in Jupyter Notebook auf einem Randknoten ausgeführt (der bereits Funken, Hadoop, Hive, Tez, etc ... Setup/konfiguriert hat). Die Python-Umgebung wird von conda für Python v2.7 verwaltet. Jupyter wird mit pyspark wie folgt gestartet.

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

Als ich in die Spark-Anwendung UI unter Environment gehen, hat die folgende Classpath Entries Folgendes.

  • /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/funken-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar
  • /usr/hdp/aktuelle/hadoop-client/conf/
  • /usr/hdp/current/funken-historyserver/conf/

Die sun.boot.class.path hat den folgenden Wert: /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.

Die spark.executorEnv.PYTHONPATH hat den folgenden Wert: /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.

Die Hadoop Distribution erfolgt über CDH: Hadoop 2.7.1.2.4.2.0-258

+0

Wie werden die Snippets ausgeführt? Was ist der CLASSPATH? –

+0

Fügen Sie einfach weitere Informationen zur Ausführung + Umgebung + Klassenpfad hinzu. –

Antwort

1

unter Angabe derSteve Loughran (der scheint seine Erfolgsbilanz in der Spark-Entwicklung angesichts der Quelle der Wahrheit über das Thema Zugriff auf S3-Dateisysteme zu sein) von SPARK-15965 No FileSystem for scheme: s3n or s3a spark-2.0.0 and spark-1.6.1:

Dies wird mit Tests in meiner Arbeit in SPARK-7481 behoben; Das Handbuch Workaround ist

Spark 1.6 + Dies benötigt meine Patch eine Neuerstellung der Funkenbaugruppe. Sobald jedoch das Patch in ist, versuchen die Montage ohne AWS JARs verwenden wird ab dem Funken stoppen -Außer Sie Hadoop nach oben 2.7.3

Es gibt auch einige andere Quellen, wo Sie Abhilfen finden:

ich keine Umgebung haben (und Erfahrung) die über einen Schuss zu geben, so, nachdem Sie die oben einen Versuch geben Sie ein besseres Verständnis für die aktuelle Situation in Bezug auf S3 Unterstützung in Spark haben berichten . Vielen Dank.

+1

Ich betrachte mich lieber als Quelle konsistenter Behauptungen und nicht als Wahrheit: Letzteres wird nur durch die Tests festgehalten. Das Funken-Hadoop-Cloud-Modul befindet sich in Spark 2.3, so dass alle Builds mit -Phadoop-Cloud nicht eingerichtet sind. Für Spark 1.6 benötigen Sie eine passende Version von hadoop-aws und amazon-s3-sdk auf dem CP. Ich weiß nicht, was CDH dort tut, tut mir leid. –

Verwandte Themen