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配置那个目录

Java Kerberos 是一个在 Java 平台上实现的网络认证协议,它使用密钥分发中心(KDC)来实现双方认证与密钥分发。Kerberos 协议旨在提供强大的身份验证和加密通信,可以保护网络中的数据传输安全。 Java Kerberos 提供了 Kerberos 客户端和 Kerberos 服务端的 API,使得开发人员可以使用 Java 语言轻松地实现 Kerberos 协议的集成。通过 Java Kerberos,我们可以在 Java 应用程序之间进行安全的身份验证和通信。 使用 Java Kerberos,首先需要进行以下步骤: 1. 安装与配置 Kerberos 服务端:要使用 Java Kerberos,需要安装和配置一个 Kerberos 服务端,这个服务端将负责生成并验证 Kerberos TGT(票据授权票)和服务票据。 2. 配置 Java 客户端:在 Java 应用程序中,需要配置 Kerberos 客户端以连接到 Kerberos 服务端。配置包括指定 KDC 的主机名和端口号,以及指定 Realm(领域)。 3. 实现 Kerberos 认证逻辑:在 Java 应用程序代码中,需要集成 Kerberos API,并实现认证逻辑。这些逻辑包括: - 客户端请求 TGT:客户端向 Kerberos 服务端发送身份验证请求,获取 TGT。 - 客户端使用 TGT 请求服务票据:客户端使用 TGT 向 Kerberos 服务端请求服务票据,这会导致服务票据被返回给客户端。 - 服务端验证票据:服务端接收到客户端发送的服务票据请求,对票据进行验证,并向客户端发送成功或失败的响应。 4. 安全通信:一旦身份验证和票据交换完成,Java 应用程序间就可以使用安全的通信协议(如 SSL/TLS)进行加密通信。 总之,Java Kerberos 提供了一种保护网络通信的强大工具,开发人员可以利用 Java Kerberos API 在 Java 应用程序中轻松地实现 Kerberos 认证和安全通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hblicy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值