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 [email protected] 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配置那个目录

你可能感兴趣的:(Hadoop,CDH)