本人使用的为phoenix 5.0.x 以及集群hdp3.1
hbase 2.0.2
报错信息为
19/08/27 14:32:09 INFO RpcRetryingCallerImpl :Call exception, tries=10, retries=35, started=38465 ms ago, cancelled=false, msg=row 'bvuser,195861555,99999999999999' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=blueview-t07,16020,1478499043493, seqNum=0
failed on local exception ;javax.security.sasl.SaslException:GSS initate failed [
Caused by GSSException :No valid credentials provided (Mechanism level :S
ever not found in Kerberos databases(7) - LOOKING UP SERVER],
我们可以看到明确的信息是sever not found in Kerberos databases。
由于我使用hbase api 连接是没问题的。
我个人的phoenix配置也是反复检查是正确的。
19/08/27 14:31:52 INFO UserGroupinformation:Login successful for user it1
using keytab file /home/user/user.keytab
代码报出个人信息验证是正确的!
那么问题出在后面获取服务权限!
个人推断是由于hdp服务未配置phoenix querysever ,导致Kerberos配置未注册这个phoenix的 principe name。导致虽然个人用户可以验证,但是无法获取访问h指定sever的权限。故报此错误。
正在联系运维讨论如何处理!
大致是清楚了。由于代码当中对phoenix的连接。需要对hbase的conf做定义,我个人定义hbase.master.kerberos.principal该属性有误。集群配置被运维更新了。后面重新配置更新后的属性。即成功访问了,以下代码内网。纯手打。已作隐私处理
val preperties=new Properties()
//相关hbase配置
properties.setProperty("hbase.zookeeper.quorum","localhost")
properties.setProperty("hbase.master.kerberos.principal","hbase/_HOST@***")
properties.setProperty("hbase.regionserver.kerberos.principal","hbase/_HOST@***")
properties.setProperty("phoenix.queryserver.kerberos.principal","HTTP/_HOST@***")
properties.setProperty("hadoop.security.authentication","kerberos")
properties.setProperty("hbase.security.authentication","kerberos")
properties.setProperty("zookeeper.znode.parent","/hbase-secure")
//个人的用户验证文件
properties.setProperty("hbase.myclient.principal","user/@**")
properties.setProperty("hbase.myclient.keytab","***/user.keytab")
看完以上配置后就如同正常的jdbc的路线来写就好了
//此处url需要拼接一下用户的principal并且要用:连接
//localhost位置换成zk的node地址就可以了用,隔开
val url="jdbc:phoenix:localhost:2181:/hbase-secure:/user@***"
var connection:Connecion=null
val sql="select * from **"
try{
Class.forname("org.apache.phoenix.jdbc.PhoenixDriver")
connection=DriverManager.getConnection(url,properties)
val statement=connection.createStatement()
val rs=statement.executeQuery(sql)
while(rs.next()){
val aa=rs.getStrin("aa")
array+= aa
}
}catch{
case t:Throwable=> t.printStackTrace()
}
array
实测没有任何问题!
有问题请联系我!