df.show возвращает java.lang.ClassNotFoundException: org.postgresql.Driver
Пожалуйста , ознакомьтесь с любовью это не дублирование этого .
Я пытаюсь получить доступ к базе данных 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)
Я не понимаю, почему я могу видеть схему, но не содержимое.
Любая помощь? Спасибо.
Ответы
Когда вы отправляете задание на задание hadoop, мастер может быть создан на любом из ваших рабочих узлов, включая главный (в зависимости от вашей конфигурации). Если вы используете EMR, ваше главное приложение по умолчанию создается на любом из ваших рабочих узлов (CORE node), но не на главном.
Ваш файл существует, /home/hadoop/postgresql-42.2.18.jarя предполагаю, что это означает на главном узле.
Ваша программа будет искать этот файл на том узле, где находится мастер приложения, и его определенно нет на вашем главном узле, потому что при этом вы не получите никаких ошибок.
Чтобы решить эту проблему:
- Поместите банку в каждый основной узел (не масштабируемое решение)
- Используйте
hdfs://. Помещение его в HDFS - гораздо лучший вариант. Здесь HDFS используется для всех экземпляров CORE & TASK. - То же, что HDFS вместо S3, и получить его через EMRFS (
s3://)
PS: я не знаю, как вы можете увидеть схему с spark.driver.extraClassPath
Я решил эту проблему, добавив следующие параметры в меню интерпретатора Zeppelin:
spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar
spark.jars.packages=org.postgresql:postgresql:42.2.18