Kerberos群集中无法通过Spark JDBC连接到Hive服务器

时间:2019-05-22 15:14:41

标签: java apache-spark jdbc hive kerberos

我尝试从一个配置单元(配置单元n°1)读取数据并将结果写入另一配置单元(配置单元n°2)(它们来自2个不同的群集)。我不能使用单个spark会话来连接到Hive,因此我将使用jdbc读取数据,并使用Spark Hive上下文写入数据。

两个集群都使用kerberos,nox,ranger。

第三个批次火花将在蜂巢n°2上运行

这是我的主要错误:

  

GSSException:未提供有效的凭据(机制级别:找不到任何Kerberos tgt)

我已经尝试过的东西:

  • 我可以使用beeline commande,zookeeper发现模式和直接http连接到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());

我很容易识别(在火花记录中):

  

使用以下身份登录:A@XXX.LOCAL(auth:KERBEROS)

     

当前用户:A(auth:SIMPLE)

我也可以在提交火花之前先做一个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配置

我使用HDP 2.6.4,Java 8,Spark 2.2.1

已更新: 在参孙回复后:

我将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:未提供有效的凭据(机制级别:尝试获取新的INITIATE凭据失败!(空))

     

搜索主题以获取Kerberos V5 INIT凭据(<>,sun.security.jgss.krb5.Krb5InitCredential)

1 个答案:

答案 0 :(得分:0)

尝试使用它。 我假设您正在通过主体和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);

让我知道它是否有效。