Работа с jdbc jar в pyspark

Мне нужно прочитать из базы данных Postgres SQL в Pyspark. Я знаю, что об этом спрашивали раньше, таких какВот, Вот и во многих других местах, однако, решения там или используют jar в локальном рабочем каталоге или копируют его всем работникам вручную.

Я скачал jar postgresql-9.4.1208 и поместил его в / tmp / jars. Затем я продолжил вызывать pyspark с ключами --jars и --driver-class-path:

pyspark --master yarn --jars /tmp/jars/postgresql-9.4.1208.jar --driver-class-path /tmp/jars/postgresql-9.4.1208.jar

Внутри pyspark я сделал:

df = sqlContext.read.format("jdbc").options(url="jdbc:postgresql://ip_address:port/db_name?user=myuser&password=mypasswd", dbtable="table_name").load()
df.count()

Однако, хотя использование --jars и --driver-class-path хорошо работало для созданных мною jar-файлов, для jdbc не получилось, и я получил исключение от рабочих:

 java.lang.IllegalStateException: Did not find registered driver with class org.postgresql.Driver

Если я скопирую банку вручную всем работникам и добавлю --conf spark.executor.extraClassPath и --conf spark.driver.extraClassPath, он будет работать (с той же банкой).документация Кстати, предлагает использовать SPARK_CLASSPATH, который устарел, фактически добавляет эти два параметра (но имеет побочный эффект предотвращения добавления других файлов JAR с опцией --jars, что мне нужно сделать)

Поэтому мой вопрос: что особенного в драйвере jdbc, который делает его неработающим, и как я могу добавить его без необходимости вручную копировать его всем работникам.

Обновить:

Я сделал еще несколько поисков и нашел это в документации: «Класс драйвера JDBC должен быть виден первичному загрузчику классов в сеансе клиента и во всех исполнителях. Это потому, что класс DriverManager в Java выполняет проверку безопасности, в результате которой игнорируются все драйверы не видны первичному загрузчику классов при открытии соединения. Один из удобных способов сделать это - изменить compute_classpath.sh на всех рабочих узлах, добавив в него JAR-файлы вашего драйвера. ".

Проблема в том, что я не могу найти computer_classpath.sh и не понимаю, что означает первоначальный загрузчик классов.

Я нашелэтот что в основном объясняет, что это должно быть сделано на местном уровне. Я также нашелэтот который в основном говорит, что есть исправление, но оно еще не доступно в версии 1.6.1.

Ответы на вопрос(3)

Ваш ответ на вопрос