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
Wie werden die Snippets ausgeführt? Was ist der CLASSPATH? –
Fügen Sie einfach weitere Informationen zur Ausführung + Umgebung + Klassenpfad hinzu. –