Spark - 将 JDBC 驱动程序 JAR 添加到 Google Dataproc

Spark - Adding JDBC Driver JAR to Google Dataproc

我正在尝试通过 JDBC 写作:

df.write.jdbc("jdbc:postgresql://123.123.123.123:5432/myDatabase", "myTable", props)

Spark docs 说明配置选项 spark.driver.extraClassPath 不能用于添加 JDBC 驱动程序 JAR,如果 运行 处于客户端模式(这是 Dataproc 运行的模式) 因为 JVM 已经启动。

我尝试在 Dataproc 的提交命令中添加 JAR 路径:

gcloud beta dataproc jobs submit spark ... 
     --jars file:///home/bryan/org.postgresql.postgresql-9.4-1203-jdbc41.jar

我还添加了加载驱动的命令:

  Class.forName("org.postgresql.Driver")

但我仍然得到错误:

java.sql.SQLException: No suitable driver found for jdbc:postgresql://123.123.123.123:5432/myDatabase 

根据我的经验,将 driver 添加到属性通常可以解决问题:

props.put("driver", "org.postgresql.Driver")
db.write.jdbc(url, table, props)

您可能想尝试将 --driver-class-path 添加到命令参数的最后:

gcloud beta dataproc jobs submit spark ... 
    --jars file:///home/bryan/org.postgresql.postgresql-9.4-1203-jdbc41.jar \
    --driver-class-path /home/bryan/org.postgresql.postgresql-9.4-1203-jdbc41.jar

如果你在作业之前将 jarfile 暂存到集群上,另一种方法是将你需要的 jarfile 转储到 /usr/lib/hadoop/lib/ 中,它应该自动成为 Hadoop 和 Spark 作业的驱动程序类路径的一部分.

当通过 Dataproc 提交 Spark 作业时,您可以使用 --properties 参数将 jar(来自 --jars 参数)添加到 Spark Driver class-path:

$ gcloud dataproc jobs submit spark ... \
    --jars=gs://<BUCKET>/<DIRECTORIES>/<JAR_NAME> \
    --properties=spark.driver.extraClassPath=<JAR_NAME>