df.show mengembalikan java.lang.ClassNotFoundException: org.postgresql.Driver
Harap baca dengan seksama ini bukan duplikasi dari ini .
Saya mencoba mengakses database RDS melalui EMR di AWS. Saya melakukan ini di Zeppelin:
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()
Ketika saya mengeksekusi saya mendapat kesalahan ini:
java.lang.ClassNotFoundException: org.postgresql.Driver
Jadi saya menemukan ini dan berfungsi dengan baik karena saya dapat melihat skema tabel saya (saya menambahkan variabel spark.driver.extraClassPath dalam konfigurasi interpreter saya):
root
|-- domaine: string (nullable = true)
|-- traitement: string (nullable = true)
|-- parquet: string (nullable = true)
|-- status: string (nullable = true)
|-- date: date (nullable = true)
TAPI, ketika saya mencoba melakukan df.show()untuk melihat konten tabel itu mengembalikan kesalahan yang sama dari sebelumnya:
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)
Saya tidak mengerti mengapa saya dapat melihat skema tetapi tidak kontennya.
Ada bantuan? Terima kasih.
Jawaban
Saat Anda mengirimkan, master lamaran pekerjaan hadoop dapat dibuat di salah satu node pekerja Anda termasuk node master (bergantung pada konfigurasi Anda). Jika Anda menggunakan EMR, master aplikasi Anda secara default dibuat di salah satu node pekerja Anda (node CORE) tetapi tidak di master.
File Anda ada di /home/hadoop/postgresql-42.2.18.jarSaya mengasumsikan itu berarti pada node master.
Program Anda akan mencari file ini di node di mana master aplikasi berada dan yang pasti bukan di node master Anda karena untuk itu Anda tidak akan mendapatkan kesalahan.
Untuk mengatasi masalah ini:
- Letakkan toples di setiap simpul inti (Bukan solusi yang dapat diskalakan)
- Gunakan
hdfs://. Menempatkannya di HDFS itu pilihan yang jauh lebih baik. Di sini HDFS dibagikan dengan semua instance CORE & TASK. - Sama seperti HDFS, bukan S3 dan ambil melalui EMRFS (
s3://)
PS: Saya tidak tahu bagaimana Anda bisa melihat skema dengan spark.driver.extraClassPath
Saya menyelesaikan masalah ini dengan menambahkan parameter berikut di menu juru bahasa Zeppelin:
spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar
spark.jars.packages=org.postgresql:postgresql:42.2.18