df.show trả về java.lang.ClassNotFoundException: org.postgresql.Driver

Nov 04 2020

Xin vui lòng đọc cẩn thận đây không phải là một bản sao của điều này .

Tôi đang cố gắng truy cập cơ sở dữ liệu RDS qua EMR trên AWS. Tôi đã làm điều này trên 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()

Khi thực hiện, tôi gặp lỗi này:

java.lang.ClassNotFoundException: org.postgresql.Driver 

Vì vậy, tôi đã tìm thấy điều này và nó hoạt động tốt khi tôi có thể thấy lược đồ của bảng của mình (tôi đã thêm biến spark.driver.extraClassPath trong cấu hình trình thông dịch của mình):

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

NHƯNG, khi tôi cố gắng làm df.show()để xem nội dung của bảng, nó sẽ trả về cùng một lỗi từ trước:

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)

Tôi không hiểu tại sao tôi có thể xem lược đồ nhưng không thấy nội dung.

Bất kỳ giúp đỡ? Cảm ơn bạn.

Trả lời

Snigdhajyoti Nov 05 2020 at 02:41

Khi bạn gửi đơn xin việc hadoop chủ có thể được tạo trên bất kỳ nút công nhân nào của bạn kể cả nút chính (tùy thuộc vào cấu hình của bạn). Nếu bạn đang sử dụng EMR, ứng dụng chính của bạn theo mặc định được tạo trên bất kỳ nút công nhân nào của bạn (nút CORE) nhưng không phải trên nút chính.

Tệp của bạn tồn tại trên /home/hadoop/postgresql-42.2.18.jarTôi giả sử điều đó có nghĩa là trên nút chính.
Chương trình của bạn sẽ tìm kiếm tệp này trên nút đó, nơi có ứng dụng chính và nó chắc chắn không nằm trên nút chính của bạn vì đối với điều đó, bạn sẽ không gặp bất kỳ lỗi nào.


Để giải quyết vấn đề này:

  1. Đặt bình vào mọi nút lõi (Không phải là giải pháp có thể mở rộng)
  2. Sử dụng hdfs://. Đưa nó vào HDFS nó là lựa chọn tốt hơn nhiều. Ở đây HDFS được chia sẻ với tất cả cá thể CORE & TASK.
  3. Tương tự như HDFS thay vì S3 và tìm nạp nó qua EMRFS ( s3://)

Tái bút: Tôi không biết làm thế nào bạn có thể xem lược đồ với spark.driver.extraClassPath

Haha Nov 06 2020 at 20:53

Tôi đã giải quyết sự cố này bằng cách thêm các thông số sau vào menu trình thông dịch Zeppelin:

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