我需要编写自定义 UDF 以从 Hbase Table 查找数据。
注意:我已经使用 HIVE 进行了单元测试。它似乎正在工作。
但是当我使用相同的 UDF 直线时,它失败了。默认情况下,Cloudera 限制模拟,只允许 hive 用户在 Beeline 中运行查询。在 Job 启动时,YarnChild 正在设置以下委托令牌。
我想添加令牌(种类:HBASE_AUTH_TOKEN)来处理 Hbase。
Kind: mapreduce.job
Kind: HDFS_DELEGATION_TOKEN
Kind: kms-dt
我研究并发现了 HbaseStorageHandler 如何为 Hbase 使用委托令牌(即 HBASE_AUTH_TOKEN)。所以我使用了相同的功能集,但它也不起作用。
来自 HbasestorageHandler 的函数(获取 Job 的令牌):
private void addHBaseDelegationToken(Configuration conf, JobConf jconf) throws IOException {
if (User.isHBaseSecurityEnabled(conf)) {
try {
logger.info("isHbaseSecurityEnabled :True ");
User e = User.getCurrent();
logger.info("isHbaseSecurityEnabled :User ==> " + e.toString());
Token authToken = getAuthToken(conf, e);
logger.info("isHbaseSecurityEnabled :AuthToken==> "+authToken.toString());
Job job = new Job(conf);
if(authToken == null) {
UserGroupInformation ugi = UserGroupInformation.getLoginUser();
ugi.setAuthenticationMethod(UserGroupInformation.AuthenticationMethod.KERBEROS);
e.obtainAuthTokenForJob(jconf);
} else {
logger.info("authToken is not null"+authToken.toString());
job.getCredentials().addToken(authToken.getService(), authToken);
}
logger.info("obtained Token /....");
} catch (InterruptedException var5) {
throw new IOException("Error while obtaining hbase delegation token", var5);
}
}
}
private static Token<AuthenticationTokenIdentifier> getAuthToken(Configuration conf, User user) throws IOException, InterruptedException {
ZooKeeperWatcher zkw = new ZooKeeperWatcher(conf, "mr-init-credentials", (Abortable) null);
Token var4;
try {
String e = ZKClusterId.readClusterIdZNode(zkw);
logger.info("====== clusterID : " + e);
var4 = (new AuthenticationTokenSelector()).selectToken(new Text(e), user.getUGI().getTokens());
if (var4 == null) {
logger.info("var4 is null===========================");
} else {
logger.info("====== Hbase Token : " + var4.toString());
}
} catch (KeeperException var8) {
throw new IOException(var8);
} catch (NullPointerException np) {
return null;
} finally {
zkw.close();
}
return var4;
}
在 UDF 的 configure() 中调用 addHBaseDelegationToken() 之后。我收到以下异常。我不确定如何让 hvie 用户与 Hbase 交谈,因为 hive.keytab 由 Cloudera 处理并受到保护。
任何输入都可能会有所帮助。谢谢 !
异常堆栈跟踪:
2018-10-11 04:48:07,625 WARN [main] org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hive (auth:SIMPLE) 原因:javax.security.sasl.SaslException: GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:找不到任何 Kerberos tgt)] 2018-10-11 04:48:07,627 WARN [main] org.apache.hadoop.hbase.ipc.RpcClientImpl:连接到服务器时遇到异常:javax.security.sasl.SaslException:GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:找不到任何 Kerberos tgt)] 2018-10-11 04:48:07,628 FATAL [main] org.apache .hadoop.hbase.ipc.RpcClientImpl:SASL 身份验证失败。最可能的原因是凭据丢失或无效。考虑“kinit”。javax.security.sasl.SaslException:
已尝试以下选项: