df.show gibt java.lang.ClassNotFoundException zurück: org.postgresql.Driver
Bitte lesen Sie dies kein Zentrum entfernt Doppel ist dies .
Ich versuche, über EMR unter AWS auf eine RDS-Datenbank zuzugreifen. Ich habe das auf Zeppelin gemacht:
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.jars", "/home/hadoop/postgresql-42.2.18.jar") \
.getOrCreate()
df = spark.read \
.format("jdbc") \
.option("url", "jdbc:postgresql://host:5432/base") \
.option("dbtable", "tab") \
.option("user", "xx") \
.option("password", "xx") \
.option("driver", "org.postgresql.Driver") \
.load()
df.printSchema()
Bei der Ausführung wurde folgende Fehlermeldung angezeigt:
java.lang.ClassNotFoundException: org.postgresql.Driver
So fand ich dies und es funktionierte gut , wie ich meine Tabelle Schema sehen kann (ich hinzugefügt , um die spark.driver.extraClassPath Variable in meinen Dolmetscher - Konfigurationen):
root
|-- domaine: string (nullable = true)
|-- traitement: string (nullable = true)
|-- parquet: string (nullable = true)
|-- status: string (nullable = true)
|-- date: date (nullable = true)
ABER, wenn ich versuche, df.show()den Inhalt der Tabelle zu sehen, wird der gleiche Fehler wie zuvor zurückgegeben:
Py4JJavaError: An error occurred while calling o118.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, host, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver
at org.apache.spark.repl.ExecutorClassLoader.findClass(ExecutorClassLoader.scala:124)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
Ich verstehe nicht, warum ich das Schema sehen kann, aber nicht den Inhalt.
Irgendeine Hilfe? Vielen Dank.
Antworten
Wenn Sie eine Hadoop-Bewerbung einreichen, kann der Master auf jedem Ihrer Worker-Knoten einschließlich des Master-Knotens erstellt werden (abhängig von Ihrer Konfiguration). Wenn Sie EMR verwenden, wird Ihr Anwendungsmaster standardmäßig auf einem Ihrer Worker-Knoten (CORE-Knoten) erstellt, jedoch nicht auf dem Master.
Ihre Datei existiert auf /home/hadoop/postgresql-42.2.18.jarIch gehe davon aus, dass dies auf dem Masterknoten bedeutet.
Ihr Programm sucht nach dieser Datei auf dem Knoten, auf dem sich der Anwendungsmaster befindet, und definitiv nicht auf Ihrem Masterknoten, da Sie dafür keinen Fehler erhalten würden.
So lösen Sie dieses Problem:
- Setzen Sie das Glas in jeden Kernknoten ein (keine skalierbare Lösung)
- Verwenden Sie
hdfs://. Wenn Sie es in HDFS einfügen, ist es eine viel bessere Option. Hier wird HDFS mit allen CORE & TASK-Instanzen geteilt. - Wie HDFS statt S3 und holen Sie es über EMRFS (
s3://)
PS: Ich weiß nicht, wie Sie das Schema mit sehen können spark.driver.extraClassPath
Ich habe dieses Problem durch Hinzufügen der folgenden Parameter im Zeppelin-Interpreter-Menü behoben:
spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar
spark.jars.packages=org.postgresql:postgresql:42.2.18