sparkstreaming使用keberos认证写hbase

        最近在项目实施过程中,使用hdp和cdh集群时,hbase配置了kerberos认证之后,通过sparkstreaming程序连接操作hbase时,会出以如下错误:

1、ERROR ipc.AbstractRpcClient: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.javax.security.sasl.SaslException: GSS initiate failed

javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any kerberos tgt)]

2、java.io.IOException: Login failure for xxx@CLOUD.COM from keytab /etc/xxx.keytab: javax.security.auth.login.LoginException: Unable to obtain password from user

程序用local模式没有问题,用yarn-cluster和yarn-client模式,spark-submit添加了--keytab和--principal,也会出现上述问题。

现在看看kerberos认证的hbase的写过程:

由于配置文件在maven编译后,打成jar包被driver分发到各个excutor的缓存区中,各配置文件properties,由于底层使用反射技术可以进入jar中读取配置供程序使用。但是keytab作为一个单独的文件,由于没有使用properties,程序只能从文件夹中进行读取,在文件中使用传统的kerberos认证就会出现找不到文件的情况。

有两种方式可以解决这种问题:1.在sparkcontext处,使用sc.addfile(""),可以将文件加入到excutor的内存中去,同时在hbase进行IO操作的代码处使用SparkFiles.get()即可获取内存中文件。2.spark-submit提交命令中使用 --files xx.keytab 将文件加入到excutor内存中,使用获取jar包路径的反射方式进而拼接出keytab的路径,即可获取keytab文件。

最后将经过认证的user,加入到connection中,然后使用这个connection即可对hbase进行写操作了。

我的解决方式如下:

1、$SPARK_HOME/conf下需放置集群xml文件

2、集群所有节点需新建跟kerberos实体一样的用户

3、集群所有节点都放置用户keytab文件在相同的目录,客户端spark-submit时--keytab配置那个目录

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hblicy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值