#postgresql #apache-spark #jdbc #pyspark
Вопрос:
Я хочу считывать данные из Postgresql с помощью JDBC и хранить их в фрейме данных pyspark. Когда я хочу просмотреть данные в фрейме данных с помощью таких методов, как df.show (), df.take (), они возвращают сообщение об ошибке, вызванное: java.lang.Исключение ClassNotFoundException: org.postgresql.Драйвер. Но df.printschema() отлично вернет информацию о таблице БД. Вот мой код:
from pyspark.sql import SparkSession
spark = (SparkSession
.builder
.master("spark://spark-master:7077")
.appName("read-postgres-jdbc")
.config("spark.driver.extraClassPath", "/opt/workspace/postgresql-42.2.18.jar")
.config("spark.executor.memory", "1g")
.getOrCreate())
sc = spark.sparkContext
df = (
spark.read
.format("jdbc")
.option("driver", "org.postgresql.Driver")
.option("url", "jdbc:postgresql://postgres/postgres")
.option("table", "public."ASSET_DATA"")
.option("dbtable", _select_sql)
.option("user", "airflow")
.option("password", "airflow")
.load()
)
df.show(1)
Журнал ошибок:
Py4JJavaError: An error occurred while calling o44.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, 172.21.0.6, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver
Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver
Отредактировано 24/24/2021
Сценарий был выполнен на JupyterLab в отдельном контейнере docker из автономного кластера Spark.
Ответ №1:
Вы не используете правильную опцию. Читая документ, вы видите это :
Дополнительные записи пути к классу, добавляемые к пути к классу драйвера. Примечание. В клиентском режиме эта конфигурация не должна устанавливаться через SparkConf непосредственно в вашем приложении, поскольку в этот момент JVM драйвера уже запущен. Вместо этого, пожалуйста, установите это с помощью параметра командной строки —путь к классу драйвера или в файле свойств по умолчанию.
Эта опция предназначена для водителя. Это причина, по которой получение схемы работает, это действие, выполняемое на стороне водителя. Но когда вы запускаете команду spark, эта команда выполняется рабочими (или исполнителями). Им также необходимо иметь .jar
доступ к postgres.
Если ваш драйвер postgres («/opt/workspace/postgresql-42.2.18.jar») не нуждается в каких — либо зависимостях, тогда вы можете добавить его к рабочему с помощью spark.jars
-я знаю, что mysql, например, не требует дополнительных функций, но я никогда не пробовал postgres. Если ему нужны зависимости, то лучше вызвать пакет напрямую из maven, используя spark.jars.packages
опцию. (см. Ссылку документа для справки)