python 如何在 SparkSession 上启用 ssl

How to enable ssl on SparkSession in python

我们正在使用 AWS Glue 连接到我们的 Postgres 数据库。

from pyspark.sql import SparkSession
from pyspark.conf import SparkConf
ss = SparkSession.builder.appName("profile-dump-dev").getOrCreate()
c = SparkConf()
ss.builder.config(conf=c)
...
x = ss.read.format("jdbc").option("url",url).option("query","select * from foo").load()
# The above line throws an exception ^

例外情况是:

FATAL: no pg_hba.conf entry for host "10.20.0.153", user "XXX"

在我们的 pg_hba.conf 中有(这意味着必须启用 SSL):

hostssl X X X X

我们可以通过 psql 和 django 等工具毫无问题地访问 Postgres 数据库。 当我们通过正常方法访问数据库时,我们在 postgres 日志中看到:

connection authorized: user=XXX database=XXX SSL enabled (protocol=TLSv1.2, cipher=ECDHE-RSA-AES256-GCM-SHA384, compression=off)",,,,,,,,,"

那么简而言之,我们如何在使用 SparkSession 时启用 SSL?

根据这个文档: https://jdbc.postgresql.org/documentation/head/ssl-client.html 我们可以将其传递给驱动程序:"ssl=true".

但是如何将 ssl=true 传递给驱动程序?我们正在使用 python.

我们与 AWS Support 进行了交谈。这是使其工作的代码:

  remote_table = spark.read.format("jdbc")\
      .option("driver", driver)\
      .option("url", url)\
      .option("dbtable", table)\
      .option("user", user)\
      .option("password", password)\
      .option("ssl", True) \
      .option("sslmode", "require" ) \
      .load()

神奇的是 sslmode == require。 您不必明确使用任何证书或任何东西。我们根本没有任何自定义证书,这就是为什么我们的连接对象工作正常(它在幕后使用 SSL),但是对于 sparck,您明确需要说 ssl == True 和 sslmode == require.