org.postgresql.util.PSQLException:SSL 错误:从 Azure Databricks 写入 Azure Postgres Citus 时收到致命警报:handshake_failure

ans*_*hed 3 azure apache-spark pyspark azure-postgresql azure-databricks

我正在尝试将 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 是公共的。

ans*_*hed 8

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

\n

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

\n

解释:

\n

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

\n

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

\n

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

\n