我正在尝试将 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 是公共(public)的。
最佳答案
它的工作原理是覆盖驱动程序和执行程序的 java 安全属性
spark.driver.extraJavaOptions -Djava.security.properties=
spark.executor.extraJavaOptions -Djava.security.properties=
说明:
实际情况是,JVM 的“security”变量默认读取以下文件 (/databricks/spark/dbconf/java/extra.security) 并在此文件中默认情况下禁用一些 TLS 算法。这意味着如果我编辑此文件并将适用于 PostGres citus 的 TLS 密码替换为也应该适用的空字符串。
当我将此变量设置为执行程序 (spark.executor.extraJavaOptions) 时,它不会更改 JVM 中的默认变量。对于覆盖的驱动程序不会发生同样的情况,因此它开始工作。
注意:我们需要在读取变量之前编辑此文件,因此初始化脚本是实现此目的的唯一方法。
关于azure - org.postgresql.util.PSQLException : SSL error: Received fatal alert: handshake_failure while writing from Azure Databricks to Azure Postgres Citus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63868745/