使用 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)有什么意义?