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天记录
6.遇到的问题记录
任何事情都不是一帆风顺的,遇到的坑,也必须记录
错误一
第一次报认证的错误…
于是调整策略,我把认证的代码,在我的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…
于是持续排查这个错误两天,各种尝试,最终都逃不过这两个错误,我也是醉醉的
错误二
于是开始回想之前琢磨的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版本作为维表的功能