Trabajando con jdbc jar en pyspark

Necesito leer de una base de datos sql de postgres en pyspark. Sé que esto se ha preguntado antes, comoaquí, aquí y en muchos otros lugares, sin embargo, las soluciones allí usan un jar en el directorio de ejecución local o lo copian a todos los trabajadores manualmente.

Descargué el jar postgresql-9.4.1208 y lo coloqué en / tmp / jars. Luego procedí a llamar a pyspark con los modificadores --jars y --driver-class-path:

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

Dentro de pyspark hice:

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

Sin embargo, mientras usaba --jars y --driver-class-path funcionó bien para los frascos que creé, falló para jdbc y obtuve una excepción de los trabajadores:

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

Si copio el jar manualmente a todos los trabajadores y agrego --conf spark.executor.extraClassPath y --conf spark.driver.extraClassPath, funciona (con el mismo jar). losdocumentación por cierto sugiere que usar SPARK_CLASSPATH que está en desuso en realidad agrega estos dos modificadores (pero tiene el efecto secundario de evitar agregar OTROS frascos con la opción --jars que debo hacer)

Entonces mi pregunta es: ¿qué tiene de especial el controlador jdbc que hace que no funcione y cómo puedo agregarlo sin tener que copiarlo manualmente a todos los trabajadores?

Actualizar:

Busqué un poco más y encontré esto en la documentación: "La clase de controlador JDBC debe ser visible para el cargador de clases primordial en la sesión del cliente y en todos los ejecutores. Esto se debe a que la clase DriverManager de Java realiza una comprobación de seguridad que hace que ignore todo los controladores no son visibles para el cargador de clases primordial cuando se va a abrir una conexión. Una forma conveniente de hacerlo es modificar compute_classpath.sh en todos los nodos de trabajo para incluir sus JAR de controlador ".

El problema es que parece que no puedo encontrar computer_classpath.sh ni entiendo lo que significa el cargador de clases primordial.

Encontréesta lo que básicamente explica que esto debe hacerse localmente. Yo tambien encontreesta que básicamente dice que hay una solución, pero aún no está disponible en la versión 1.6.1.

Respuestas a la pregunta(3)

Su respuesta a la pregunta