Flink在开启kerberos认证环境中,使用hbase进行维表关联

1.简介

近期在项目中用到了使用hbase做为维表,进行信息补充的一个需求,同时本公司的环境均开启了kerberos,遇到如下问题进行记录,同时分享完整kerberos认证步骤

2.环境介绍

组件

版本

flink

1.7.0

hdp

3.1.0.0

3.连接hbase的RichMap方法

连接具有kerberos环境的hbase核心代码如下:

public class HbaseRichMapFunction extends RichMapFunction<Tuple2<Boolean,String>,String>{

private Connection conn = null;
private Table table1;

/**
*初始化hbase的连接
*open方法中可以使用ParameterTool工具传递参数
*/
public void open(Configuration parameters) {
		Configuration configuration = HbaseConfiguration.create();
		configuration.addResource(new Path("/tmp/hbase-site.xml"));
		conn = ConnectionFactory.createConnection(configuration);
		table1 = conn.getTable(TableName.valueOf("myHbaseTableName"));
}

public String map(Tuple2<Boolean,String> ff){
		String myRowkey = ff.f1;
		Get myget = new Get(Bytes.toBytes(myRowkey));
		Result re = table1.get(myget);
		String custNum = Bytes.toString(re.getValue(Bytes.toBytes("f"),Bytes.toBytes("CUST_NUM")))
		return custNum;
}

public void clost()throws Exception{
        super.close();
		conn.close();
		table1.close();
}
}

调用方法:

DataStream<String> richHbaseDataStream = myDataStream.map(new HbaseRichMapFunction())

4.上述代码说明

  • open方法中无需添加kerberos认证逻辑代码,这个需要在安装flink客户端的时候进行配置即可,flink可以实现过期自动刷新
  • open方法中如果需要传递变动参数,尽可能的使用ParameterTool工具类进行参数得传递

5.运行打包说明

mvn package assembly:single
上传一个带有依赖的胖包进行执行

程序稳定运行4天记录

python Kerberos认证 调用 hbase 连接hbase与kerberos_xml

6.遇到的问题记录

任何事情都不是一帆风顺的,遇到的坑,也必须记录

错误一

第一次报认证的错误…

python Kerberos认证 调用 hbase 连接hbase与kerberos_jar包_02

于是调整策略,我把认证的代码,在我的HbaseRichMapFunction类的open方法中重新写了一次

UserGroupInformation. setConfiguration(conf);
try {
UserGroupInformation. loginUserFromKeytab("flink", "/etc/security/keytabs/flink.keytab" );
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}

使用keytab文件,已经显示认证成功,但是仍然无法读取hbase表,报java.io.IOExcepiton:Failed to specify server’s kerberos principal name row…

于是持续排查这个错误两天,各种尝试,最终都逃不过这两个错误,我也是醉醉的

错误二

python Kerberos认证 调用 hbase 连接hbase与kerberos_jar包_03

于是开始回想之前琢磨的flink1.10 sql支持本司的hbase,本司采用的是hdp3.1,安装的hbase版本是2.0.2,但是官方的版本仅支持到1.4.x,为了能尝鲜使用flink sql的hbase维表功能,进行了各种尝试,最终保证了功能的正常使用。

采取同样的解决思路,我开始逐步添加依赖包至$FLINK_HOME/lib下,最终添加如下三个包,最终保证了程序的正常运行

hbase-client-2.0.2.3.1.0.0-78.jar
hbase-common-2.0.2.3.1.0.0-78.jar
hbase-protocol-2.0.2.3.1.0.0-78.jar

注意,此处替换jar包还有一个大坑

从本集群的hbase的安装目录下将上述3个包,移到flink的lib目录下,并不能解决问题,hbase-common的jar包中带有一个default-site.xml,需要把该文件删除,不然在执行任务的时候,会默认去连接localhost:2181的zookeeper,需要替换为本集群的hbase-site.xml,该处让楼主也很疑惑,当出现该问题的时候,第一反应是hbase的config指定的有问题,第一时间将HbaseRichMapFunction的open方法中写死了2181连接的机器,但是仍然去找localhost,最终替换了该文件解决了问题

目前问题解决的并不是很完美,因为本主的jar包打的是一个带所有依赖的胖包,所有依赖包均已经被打进执行的包中,可是为什么还需要把这几个包放到flink的lib目录下,问题刚好被解决了,留下一个问题,等待继续深究测试吧

Over!

下一篇,准备记录一下flink1.10中,不更改源码,仅仅通过替换jar包来支持flink sql的hbase2.0.2版本作为维表的功能