Работа с 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.