df.show, java.lang.ClassNotFoundException döndürüyor: org.postgresql.Driver

Nov 04 2020

Bunun bir çoğaltma değil carrefully okuyunuz bu .

AWS'de EMR aracılığıyla bir RDS veritabanına erişmeye çalışıyorum. Bunu Zeppelin'de yaptım:

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()

Yürüttüğümde şu hatayı aldım:

java.lang.ClassNotFoundException: org.postgresql.Driver 

Buldum Yani bu ve benim tablonun şema görebileceğiniz gibi bu cezayı çalıştı (benim tercüman yapılandırmalarında spark.driver.extraClassPath değişkeni eklendi):

root
 |-- domaine: string (nullable = true)
 |-- traitement: string (nullable = true)
 |-- parquet: string (nullable = true)
 |-- status: string (nullable = true)
 |-- date: date (nullable = true) 

AMA, df.show()tablonun içeriğini görmeye çalıştığımda , daha önce aynı hatayı döndürüyor:

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)

Neden şemayı görebildiğimi ama içeriğini göremediğimi anlamıyorum.

Herhangi bir yardım? Teşekkür ederim.

Yanıtlar

Snigdhajyoti Nov 05 2020 at 02:41

Bir hadoop iş uygulama yöneticisi gönderdiğinizde, ana düğüm dahil (yapılandırmanıza bağlı olarak) herhangi bir çalışan düğümünüzde oluşturulabilir. EMR kullanıyorsanız, uygulama yöneticiniz varsayılan olarak herhangi bir çalışan düğümünüzde (CORE düğümünde) oluşturulur, ancak ana düğümde oluşturulmaz.

Dosyanız var, /home/hadoop/postgresql-42.2.18.jarbunun ana düğümde anlamına geldiğini varsayıyorum.
Programınız bu dosyayı, uygulama yöneticisinin olduğu düğümde arayacaktır ve kesinlikle ana düğümünüzde olmayacaktır, çünkü bunun için herhangi bir hata almazsınız.


Bu sorunu çözmek için:

  1. Kavanozu her çekirdek düğüme yerleştirin (Ölçeklenebilir bir çözüm değil)
  2. Kullanın hdfs://. HDFS'ye koymak çok daha iyi bir seçenek. Burada HDFS, tüm CORE & TASK örnekleriyle paylaşılır.
  3. S3 yerine HDFS ile aynıdır ve EMRFS ( s3://) aracılığıyla getir

Not: Şemayı nasıl görebildiğinizi bilmiyorum spark.driver.extraClassPath

Haha Nov 06 2020 at 20:53

Zeppelin yorumlayıcı menüsüne aşağıdaki parametreleri ekleyerek bu sorunu çözdüm:

spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar 
spark.jars.packages=org.postgresql:postgresql:42.2.18