2

我正在尝试将 pyspark 数据帧写入 Azure Postgres Citus(超大规模)。我正在使用最新的 Postgres JDBC 驱动程序,并尝试在 Databricks Runtime 7、6、5 上进行编写。

df.write.format("jdbc").option("url","jdbc:postgresql://<HOST>:5432/citus?user=citus&password=<PWD>&sslmode=require" ).option("dbTable", table_name).mode(method).save()

这是我运行上述命令后得到的 org.postgresql.util.PSQLException: SSL error: Received fatal alert: handshake_failure

我已经在 URL 中尝试了不同的参数并且也选择了该选项,但到目前为止还没有运气。但是,我可以使用本地计算机和使用 psycopg2 在 databricks 驱动程序/笔记本上连接到此实例 Azure Postgres Citus 和 Databricks 都在同一区域,Azure Postgres Citus 是公共的。

4

1 回答 1

5

它通过覆盖驱动程序和执行程序的 java 安全属性来工作

spark.driver.extraJavaOptions -Djava.security.properties= spark.executor.extraJavaOptions -Djava.security.properties=

解释:

实际发生的情况是 JVM 的“安全”变量默认读取以下文件(/databricks/spark/dbconf/java/extra.security),并且在该文件中,有一些 TLS 算法被禁用默认。这意味着如果我编辑此文件并将适用于 PostGres citus 的 TLS 密码替换为也应该有效的空字符串。

当我将此变量设置为执行程序 (spark.executor.extraJavaOptions) 时,它不会更改 JVM 的默认变量。覆盖的驱动程序不会发生同样的情况,因此它开始工作。

注意:我们需要在读取变量之前编辑此文件,因此初始化脚本是完成此操作的唯一方法。

于 2020-09-15T12:25:28.470 回答