df.show ส่งคืน java.lang.ClassNotFoundException: org.postgresql.Driver

Nov 04 2020

โปรดอ่าน carrefully นี้ไม่ได้เป็นความซ้ำซ้อนในการนี้

ฉันพยายามเข้าถึงฐานข้อมูล RDS ผ่าน EMR บน AWS ฉันทำสิ่งนี้กับ 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()

เมื่อฉันดำเนินการฉันได้รับข้อผิดพลาดนี้:

java.lang.ClassNotFoundException: org.postgresql.Driver 

ดังนั้นฉันจึงพบสิ่งนี้และมันใช้งานได้ดีเพราะฉันเห็นสคีมาของตารางของฉัน (ฉันเพิ่มตัวแปร spark.driver.extraClassPath ในการกำหนดค่าล่ามของฉัน):

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

แต่เมื่อฉันพยายามทำdf.show()เพื่อดูเนื้อหาของตารางมันจะส่งกลับข้อผิดพลาดเดียวกันจากก่อนหน้านี้:

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)

ฉันไม่เข้าใจว่าเหตุใดฉันจึงเห็นสคีมา แต่ไม่เห็นเนื้อหา

ความช่วยเหลือใด ๆ ขอขอบคุณ.

คำตอบ

Snigdhajyoti Nov 05 2020 at 02:41

เมื่อคุณส่งต้นแบบแอปพลิเคชันงาน hadoop สามารถสร้างขึ้นบนโหนดผู้ปฏิบัติงานของคุณรวมถึงโหนดหลัก (ขึ้นอยู่กับการกำหนดค่าของคุณ) หากคุณกำลังใช้ EMR โดยค่าเริ่มต้นแอปพลิเคชันมาสเตอร์ของคุณจะถูกสร้างขึ้นบนโหนดผู้ปฏิบัติงาน (โหนด CORE) ใด ๆ ของคุณ แต่ไม่ได้อยู่บนต้นแบบ

ไฟล์ของคุณมีอยู่/home/hadoop/postgresql-42.2.18.jarโดยสมมติว่านั่นหมายถึงโหนดหลัก
โปรแกรมของคุณจะค้นหาไฟล์นี้บนโหนดนั้นที่ซึ่งแอปพลิเคชันมาสเตอร์อยู่และไม่ได้อยู่ในโหนดหลักของคุณอย่างแน่นอนเพราะคุณจะไม่ได้รับข้อผิดพลาดใด ๆ


วิธีแก้ปัญหานี้:

  1. ใส่ jar ในทุก ๆ โหนดหลัก (ไม่ใช่โซลูชันที่ปรับขนาดได้)
  2. ใช้hdfs://. ใส่ใน HDFS เป็นตัวเลือกที่ดีกว่ามาก ที่นี่ HDFS แชร์กับอินสแตนซ์ CORE & TASK ทั้งหมด
  3. เหมือนกับ HDFS แทน S3 และดึงข้อมูลผ่าน EMRFS ( s3://)

PS: ฉันไม่รู้ว่าคุณจะดูสคีมาได้อย่างไร spark.driver.extraClassPath

Haha Nov 06 2020 at 20:53

ฉันแก้ไขปัญหานี้โดยการเพิ่มพารามิเตอร์ต่อไปนี้ในเมนูล่าม Zeppelin:

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