使用Spark JDBC指定jceks文件

时间:2017-08-01 12:52:25

标签: hadoop apache-spark jdbc apache-spark-sql

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

This was achieved using 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

答案 1 :(得分:0)

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