df.show gibt java.lang.ClassNotFoundException zurück: org.postgresql.Driver

Nov 04 2020

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

Snigdhajyoti Nov 05 2020 at 02:41

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:

  1. Setzen Sie das Glas in jeden Kernknoten ein (keine skalierbare Lösung)
  2. 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.
  3. 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

Haha Nov 06 2020 at 20:53

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