无法连接到 Hive 服务器与 Spark JDBC 在 kerberized 集群中



我尝试读取一个蜂巢(Hive n°1(的数据,并将结果写入另一个蜂巢(Hive n°2((它们来自2个不同的群集(。我无法使用单个Spark会话连接到两个Hive,因此我将使用JDBC读取数据和Spark Hive上下文来编写数据。

两个集群都使用kerberos,诺克斯,游侠。

Ths批次火花将在Hive N°2

上运行

这是我的主要错误:

gssexception:没有提供有效的凭据(机制级别:未能找到任何Kerberos TGT(

我已经尝试了:

  • 我可以使用Beeline Commande,Zookeeper Discovery模式连接到Hive Server,也可以在直接HTTP中连接。
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());

我被识别得很好(在火花日志中(:

登录:a@xxx.local(auth:kerberos(

当前用户:A(auth:simple(

我在火花提交之前也要做一个Kinit:

kinit -kt <A_keytabs> <A principal> 

klist很好

我尝试添加 - keytab和 - spark-submit中的校长,但这一切都没有改变。

只有与JDBC的连接GET问题,其他我被确定为Acces HDFS Ressources,Kafka主题...

我也尝试使用java模式下的Zookeeper Discovery连接到JDBC,但这也行不通。

java.sql.sqlexception:无法打开Zookeeper中任何服务器URI的客户端传输:无法从Zookeeper读取Hiveserver2 Configs

我使用HDP 2.6.4,Java 8,Spark 2.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:没有提供有效的凭据(机制级别:尝试获得新的启动凭据失败!(null((

(

搜索Kerberos v5 Init Cred(&lt;&gt; sun.security.jgss.krb5.krb5.krb5initcredential(的搜索主题

尝试使用此功能。我假设您正在通过校长和Spark提交中的Keytab

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

让我知道它是否有效。

最新更新