java.lang.ClassNotFoundException을 반환하는 df.show : org.postgresql.Driver
이의 중복되지 carrefully 읽어 보시기 바랍니다 이 .
AWS에서 EMR을 통해 RDS 데이터베이스에 액세스하려고합니다. 나는 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)
스키마는 볼 수 있지만 내용은 볼 수없는 이유를 이해할 수 없습니다.
도움이 필요하세요? 감사합니다.
답변
Hadoop 작업을 제출하면 구성에 따라 마스터 노드를 포함한 모든 작업자 노드에 애플리케이션 마스터가 생성 될 수 있습니다. EMR을 사용하는 경우 기본적으로 애플리케이션 마스터는 마스터가 아닌 작업자 노드 (CORE 노드)에서 생성됩니다.
귀하의 파일 /home/hadoop/postgresql-42.2.18.jar은 마스터 노드에 있음을 의미한다고 가정합니다.
프로그램은 응용 프로그램 마스터가있는 해당 노드에서이 파일을 검색하고 마스터 노드에서는 오류가 발생하지 않기 때문에 확실히 마스터 노드가 아닙니다.
이 문제를 해결하려면 :
- 모든 코어 노드에 항아리를 넣으십시오 (확장 가능한 솔루션이 아님).
- 사용
hdfs://. HDFS에 넣으면 훨씬 더 좋은 옵션입니다. 여기서 HDFS는 모든 CORE & TASK 인스턴스와 공유됩니다. - S3 대신 HDFS와 동일하며 EMRFS (
s3://) 를 통해 가져옵니다.
추신 : 나는 당신이 스키마를 어떻게 볼 수 있는지 모르겠다. spark.driver.extraClassPath
Zeppelin 인터프리터 메뉴에 다음 매개 변수를 추가하여이 문제를 해결했습니다.
spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar
spark.jars.packages=org.postgresql:postgresql:42.2.18