如何使用spark中的hadoop凭据提供程序连接到oracle数据库?

2skhul33  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(479)

我正在尝试在spark和oracle以及sqoop和oracle之间建立安全连接。经过我的研究,我发现了两个不同的选择,为两个不同的设置。
将spark连接到oracle,在oracle中使用 spark.jdbc.b64password 此外,它在spark代码中被解密,并在jdbc url中使用。
使用hadoop凭据提供程序创建密码文件,并在sqoop中进一步用于连接到oracle。
现在在两个不同的文件中保存密码似乎不是一个好的做法。我的问题是,我们可以使用spark中的hadoop凭证提供者来使用为sqoop创建的相同凭证配置文件吗?
如果您有任何其他选择,使这更好,请帮助。

aiazj4mn

aiazj4mn1#

你也可以让Spark点燃 hadoop.security.credential.provider.path 在hadoop配置中:

"""
Create java key store with following command:
> keytool -genseckey -alias duke -keypass 123456 -storetype jceks -keystore keystore.jceks
> export HADOOP_CREDSTORE_PASSWORD=123456
"""
jceks = os.path.join(os.path.dirname(__file__), "keystore.jceks")
print(jceks)
assert os.path.isfile(jceks)

spark_session = lambda: (SparkSession
                         .builder
                         .enableHiveSupport()
                         .config('spark.ui.enabled', False)
                         .config("spark.hadoop.hadoop.security.credential.provider.path",
                                 "jceks://file//" + jceks)
                         .getOrCreate())
with spark_session() as spark:
    hc = spark.sparkContext._jsc.hadoopConfiguration()
    jo = hc.getPassword("duke")

    expected_password = ''.join(jo)

    assert len(retrieved_password) > 0
``` `spark.hadoop.hadoop.security.credential.provider.path` 有点奇怪但是Spark被切断了 `spark.hadoop.` 加载hadoop设置时的前缀
wswtfjt7

wswtfjt72#

您可以使用spark支持的所有语言从代码中读取jecks密码:
Python:

spark1 = SparkSession.builder.appName("xyz").master("yarn").enableHiveSupport().config("hive.exec.dynamic.partition", "true").config("hive.exec.dynamic.partition.mode", "nonstrict").getOrCreate()
x = spark1.sparkContext._jsc.hadoopConfiguration()
x.set("hadoop.security.credential.provider.path", "jceks://file///localpathtopassword")
a = x.getPassword("<password alias>")
passw = ""
for i in range(a.__len__()):
   passw = passw + str(a.__getitem__(i))

在上面的代码中,您将获得密码字符串 passw 斯卡拉:

import org.apache.hadoop.security.alias.CredentialProvider
import org.apache.hadoop.security.alias.CredentialProvider.CredentialEntry
import org.apache.hadoop.security.alias.CredentialProviderFactory
import org.apache.hadoop.conf.Configuration

val conf_H: Configuration = new org.apache.hadoop.conf.Configuration()
val alias = password_alias
val jceksPath = security_credential_provider_path`enter code here`
conf_H.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, jceksPath)
val pass = conf_H.getPassword(alias).mkString
if (pass != null && !pass.isEmpty() && !pass.equalsIgnoreCase("")) {
      jdbcPassword = pass
}
tjvv9vkg

tjvv9vkg3#

推荐的方法是在spark和hadoop以及oracle中使用kerberos身份验证。oraclejdbc瘦驱动程序支持kerberos身份验证。然后使用一个kerberos主体对从spark或hadoop到oracle数据库的所有用户进行身份验证。

相关问题