Мне нужно прочитать из базы данных postgres sql в pyspark. Я знаю, что это было задано до here, here и во многих других местах, однако решения там либо используют банку в локальном каталоге, либо копируют его всем рабочим вручную.Работа с jdbc jar в pyspark
Я загрузил банку postgresql-9.4.1208 и поместил ее в/tmp/jars. Затем я приступил к называть pyspark с --jars и --driver-класса тропу переключатели:
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 и - водитель-класс путь работал отлично для банок, которые я создал, он не для JDBC и я получил исключение из рабочих:
java.lang.IllegalStateException: Did not find registered driver with class org.postgresql.Driver
Если я копирую банку вручную для всех работников и добавить --conf spark.executor. extraClassPath и --conf spark.driver.extr aClassPath, он работает (с той же банкой). documentation btw предлагает использовать SPARK_CLASSPATH, который устарел, фактически добавляет эти два переключателя (но имеет побочный эффект предотвращения добавления ДРУГИХ банок с параметром --jars, который мне нужно сделать)
Так что мой вопрос: что особенного драйвер jdbc, который делает его неработоспособным и как его можно добавить, без необходимости вручную копировать его всем работникам.
Update:
Я еще немного, глядя и нашел это в документации:. «Класс драйвера JDBC должен быть виден изначальным загрузчик классов на сеансе клиента и на все исполнитель Это происходит потому, что Класс DriverManager Java выполняет проверку безопасности, которая приводит к тому, что он игнорирует все драйверы, которые не видны первоклассному загрузчику классов, когда вы открываете соединение. Один из удобных способов сделать это - изменить compute_classpath.sh на всех рабочих узлах, чтобы включить JAR драйверов . ".
Проблема в том, что я не могу найти computer_classpath.sh и не понимаю, что означает начальный загрузчик классов.
Я нашел this, который в основном объясняет, что это нужно делать локально. Я также нашел this, который в основном говорит, что есть исправление, но оно еще не доступно в версии 1.6.1.
Это именно« официальное »обходное решение для этой регрессии, которое, как представляется, относится к Spark 1.6.1, как описано в ** SPARK-14204 ** c/o Kevin McHale https://issues.apache.org/jira/browse/SPARK-14204 –
Мне очень жаль, что я не понял, как это работает, поскольку я не могу получить Java-код, который не является драйвером JDBC для загрузки. На самом деле, если я попытаюсь получить класс драйвера из py4j, он сообщает мне, что класс не найден. Используют ли драйверы JDBC другой шлюз py4j? –