df.show, java.lang.ClassNotFoundException döndürüyor: org.postgresql.Driver
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
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:
- Kavanozu her çekirdek düğüme yerleştirin (Ölçeklenebilir bir çözüm değil)
- Kullanın
hdfs://. HDFS'ye koymak çok daha iyi bir seçenek. Burada HDFS, tüm CORE & TASK örnekleriyle paylaşılır. - 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
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