使用 Spark JDBC 指定 jceks 文件

Posted

技术标签:

【中文标题】使用 Spark JDBC 指定 jceks 文件【英文标题】:Specifying jceks file with Spark JDBC 【发布时间】:2017-08-01 12:52:24 【问题描述】:

我正在尝试通过sqlContext.read.format("json") 方法连接到Oracle。一切都很顺利,但是在创建 JDBC 字符串时,我必须在字符串中指定数据库的用户名和密码:

val jdbcString = "jdbc:oracle:thin:USERNAME/PASSWORD@//HOSTNAME:PORT/SID"

但是,我在 HDFS 上确实有一个 jceks 文件,其中包含密码。我想知道是否有任何方法可以利用该文件连接到 JDBC 而不是纯文本密码?就像在 Sqoop 中一样,我们可以这样做:

sqoop import -Dhadoop.security.credential.provider.path=jceks://hdfs/data/credentials/oracle.password.jceks

谢谢。

【问题讨论】:

【参考方案1】:

这是使用CredentialProviderFactory 实现的。

import org.apache.hadoop.security.alias.CredentialProviderFactory

val conf = new org.apache.hadoop.conf.Configuration()
val alias = "password.alias"
val jceksPath = "jceks://hdfs/user/data/alias/mysql.password.jceks"

conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, jceksPath)

//getPassword Returns Array[Char]
val password = conf.getPassword(alias).mkString

【讨论】:

【参考方案2】:

Oracle JDBC 瘦驱动程序不支持从 jceks 文件中提取密码。它支持钱包而不是(密码可以存储在钱包中)。

【讨论】:

我在 sqooping 时使用 jceks 文件,没有任何问题。这个问题与 Hadoop 和 Spark 的关系比 Oracle 更密切。

以上是关于使用 Spark JDBC 指定 jceks 文件的主要内容,如果未能解决你的问题,请参考以下文章

保护https密钥库时,Wildfly保险库(JCEKS)有什么意义?

spark - jdbc升级版数据源

如何使用 spark.read.jdbc 读取不同 Pyspark 数据帧中的多个文件

无法使用 jdbc 将 spark 数据集写入数据库

Spark 无法从 SBT 找到 JDBC 驱动程序

SPARK_sql加载,hive以及jdbc使用