无法使用kerberised集群中的spark jdbc连接到配置单元服务器

56lgkhnf  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(644)

我尝试从一个Hive(Hiven)读取数据°1) 并将结果写入另一个配置单元(hive n°2) (他们来自两个不同的集群)。我不能使用单个spark会话连接到两个配置单元,因此我将使用jdbc读取数据,并使用spark配置单元上下文写入数据。
两个集群都使用kerberos、knox和ranger。
这批Spark将在Hiven上运行°2
这是我的主要错误:
gssexception:未提供有效凭据(机制级别:找不到任何kerberos tgt)
我已经尝试过:
我可以使用beeline命令、zookeeper发现模式和directhttp连接到hive服务器。

beeline -u "jdbc:hive2://<hiveServer2Host>:<Port>/<db>;transportMode=http;httpPath=cliservice;ssl=true;sslTrustStore=truststore.jks;trustStorePassword=<psw>;principal=<hive server 2 principal>;"

我的代码:

String url = "jdbc:hive2://<hiveServer2Host>:<Port>/<db>;transportMode=http;httpPath=cliservice;ssl=true;sslTrustStore=truststore.jks;trustStorePassword=<psw>;principal=<hive server 2 principal>";
String table = "test";
Properties connectionProperties = new Properties();
Dataset<Row> testDS= spark.read().jdbc(url, table, connectionProperties);
testDS.show();

我尝试在jdbc之前添加一些手动keberos连接:

org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());
conf.set("hadoop.security.authentication", "kerberos");
conf.set("hadoop.rpc.protection", "privacy");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab(args[0], args[1]);
System.out.println("login with: " + UserGroupInformation.getLoginUser());
System.out.println("Current User:" + UserGroupInformation.getCurrentUser());

我的身份很明确(在spark日志中):
登录方式:a@.local (auth:kerberos)
当前用户:a(auth:simple)
在spark提交之前,我还做了一个kinit:

kinit -kt <A_keytabs> <A principal>

klist很好
我试图在spark submit中添加--keytab和--principal,但没有任何改变。
只有与jdbc的连接有问题,否则我会访问hdfs资源,Kafka主题。。。
我也尝试用java模式下的zookeeper发现连接到jdbc,但这不太管用。
java.sql.sqlexception:无法打开zookeeper中任何服务器uri的客户端传输:无法从zookeeper读取hiveserver2配置
我使用hdp2.6.4、java8和spark2.2.1
更新:samson回复后:
我将jass和kbr属性添加到系统:

System.setProperty("java.security.auth.login.config", spark_jaas.conf);
System.setProperty("sun.security.jgss.debug", "true");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
System.setProperty("java.security.krb5.realm", <realm from krb5.conf>);
System.setProperty("java.security.krb5.kdc", <kdc from krb5.conf>);

我的应用程序没有崩溃,但我得到这个错误。
gssexception:未提供有效凭据(机制级别:尝试获取新的初始化凭据失败(空)
kerberos v5 init cred(<>,sun.security.jgss.krb5.krb5initcredential)的搜索主题

6jjcrrmo

6jjcrrmo1#

试着用这个。我假设你是通过校长和密钥表在spark提交

val principal: String = sparkSession.sparkContext.getConf.get("spark.yarn.principal")
val keytab: String = sparkSession.sparkContext.getConf.get("spark.yarn.keytab")
UserGroupInformation.loginUserFromKeytab(principal, keytab);

让我知道它是否有效。

相关问题