我试图建立Spark和甲骨文以及Sqoop和Oracle之间的安全连接。我的研究后,我发现了两个不同的设置两个不同的选项。
spark.jdbc.b64password
并且进一步它在火花代码被解密和在JDBC URL用它加密连接火花到Oracle。现在保存密码两个不同的文件不似乎是一个很好的做法。我的问题是,我们可以使用Hadoop的凭据提供火花用于Sqoop创建的相同凭证的个人资料?
如果您有任何其他选项,以使这更好的,请帮助。
推荐的方法是使用Kerberos身份验证无论是在Spark和Hadoop和与Oracle。 Oracle JDBC瘦驱动程序支持Kerberos身份验证。然后单个Kerberos主体用于验证用户从火花或Hadoop的Oracle数据库的所有道路。
你可以使用火花支持的所有语言,从你的代码中读jecks密码:
蟒蛇:
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
}
你也可以让火花设置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.hadoop.
前缀时负载的Hadoop设置