我尝试从一个配置单元(配置单元n°1)读取数据并将结果写入另一配置单元(配置单元n°2)(它们来自2个不同的群集)。我不能使用单个spark会话来连接到Hive,因此我将使用jdbc读取数据,并使用Spark Hive上下文写入数据。
两个集群都使用kerberos,nox,ranger。
第三个批次火花将在蜂巢n°2上运行
这是我的主要错误:
GSSException:未提供有效的凭据(机制级别:找不到任何Kerberos tgt)
我已经尝试过的东西:
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)
答案 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);
让我知道它是否有效。