前人种树,后人乘凉。本文基于社区pr:https://github.com/apache/hudi/pull/3771 ,新增一些其他配置项以完成本场景下的hudi → hive metastore元数据同步问题。
基本环境
操作系统:centos7
开启kerberos的hdp 3.1.4集群
hadoop:3.1.1.3.1.4.0-315
hive:3.1.0.3.1.4.0-315
flink:1.13.5
Kerberos:1.15.1-50.el7
修改后的代码地址:https://github.com/xiaozhch5/hudi/tree/0.10.1-release-hive3-kerberos-enabled
代码说明:本文以hudi 0.10.1 release分支为基础,针对hdp 3.1.4适配、修复hadoop3打包找不到类的问题、新增支持同步到配置了kerberos的hive3 metastore。
针对具体如何适配同步到配置了kerberos的hive3 metastore,可以看这个https://github.com/xiaozhch5/hudi/commit/05fee3608d17abbd0217818a6bf02e4ead8f6de8 ,其实也只是在社区pr:https://github.com/apache/hudi/pull/3771 的基础上新增了几个配置。
关于hdp集群开启kerberos之后相关配置说明
hdp集群开启kerberos之后,默认会在每台主机生成kerberos client配置文件/etc/krb5.conf,以及为各组件生成keytab,并放在每台主机的/etc/security/keytabs目录下,也就是下面这个目录。
我们在认证的时候需要选定其中某一台主机作为认证节点,然后将该节点的hive.service.keytab分发到所以主机上。
本文以机器中host144主机为例:
在每台主机新建一个统一的文件夹,用于存放hive对应的keytab,例如新建
代码语言:javascript复制mkdir -p /home/keydir/hive/
chmod -R 777 /home/keydir
拷贝host144的/etc/security/keytabs/hive.service.keytab文件到上述文件夹中
代码语言:javascript复制cp /etc/security/keytabs/hive.service.keytab /home/keydir/hive
chmod 777 /home/keydir/hive/hive.service.keytab
将host144节点的hive.service.keytab分发到集群所有节点的/home/keydir/hive目录下,并设置权限为777。
hudi源码编译
代码语言:javascript复制git clone -b 0.10.1-release-hive3-kerberos-enabled https://github.com/xiaozhch5/hudi
cd hudi
mvn clean install -DskipTests
-Dhadoop.version=3.1.1.3.1.4.0-315
-Dhive.version=3.1.0.3.1.4.0-315
-Dscala.version=2.12.10
-Dscala.binary.version=2.12
-Dspark.version=3.0.1
-Dflink.version=1.13.5
-Pflink-bundle-shade-hive3
-Pspark3
完成源码编译之后,将
- package/hudi-flink-bundle/target/hudi-flink-bundle_2.12-0.10.1.jar复制到flink/lib目录下
- package/hudi-hadoop-mr-bundle/target/hudi-hadoop-mr-bundle-0.10.1.jar复制到hive/auxlib目录下
这边附上编译好的jar包,可直接下载:
hudi-hadoop-mr-bundle-0.10.1.jar
hudi-flink-bundle_2.12-0.10.1.jar
在flink运行与任务提交过程中,可能会出现报某些类不存在问题,经实践,在HDP 3.1.4环境下flink的lib目录最终如下,除了上述hudi的jar包以外,其他都可以在maven仓库下载,hadoop的这个包用集群hadoop自带的即可:
以hive用户在yarn上启动 flink session
在整个过程中任务都是以hive用户执行,所以需要在flink中配置hive用户对应的kerberos认证信息,具体如下:
代码语言:javascript复制security.kerberos.login.use-ticket-cache: true
security.kerberos.login.keytab: /home/keydir/hive/hive.service.keytab
security.kerberos.login.principal: hive/host144
为了演示效果,同时设置如下checkpoints
代码语言:javascript复制execution.checkpointing.interval: 15000ms
state.backend: rocksdb
state.checkpoints.dir: hdfs://host146:8020/tmp/flink-chk
导入hadoop classpath
代码语言:javascript复制export HADOOP_CLASSPATH=`hadoop classpath`
启动flink session
代码语言:javascript复制bin/yarn-session.sh -s 3 -jm 2048 -tm 2048 -nm flink-hudi-test -d
可以在yarn上看到该任务的提交用户为hive
启动sql-client
代码语言:javascript复制bin/sql-client
提交hudi测试任务
代码语言:javascript复制CREATE TABLE sourceT (
uuid varchar(20),
name varchar(10),
age int,
ts timestamp(3),
`partition` varchar(20)
) WITH (
'connector' = 'datagen',
'rows-per-second' = '1'
);
create table t2(
uuid varchar(20),
name varchar(10),
age int,
ts timestamp(3),
`partition` varchar(20)
)
with (
'connector' = 'hudi',
'path' = 'hdfs://host146:8020/tmp/t2', -- $HUDI_DEMO 替换成的绝对路径
'table.type' = 'MERGE_ON_READ',
'write.bucket_assign.tasks' = '2',
'write.tasks' = '2',
'hive_sync.enable' = 'true',
'hive_sync.mode' = 'hms',
'hive_sync.metastore.uris' = 'thrift://host145:9083', -- ip 替换成 HMS 的地址
'hive_sync.db' = 'default',
'hive_sync.table' = 't2',
'hive_sync.kerberos.enable' = 'true',
'hive_sync.kerberos.krb5.conf' = '/etc/krb5.conf', -- 如果不指定 默认读取/etc/krb5.conf文件
'hive_sync.kerberos.principal' = 'hive/_HOST@HDP.COM', -- hive metastore principal
'hive_sync.kerberos.keytab.file' = '/home/keydir/hive/hive.service.keytab', -- hive metastore对应的 keytab
'hive_sync.kerberos.keytab.name' = 'hive/host144' -- hive metastore keytab对应的principal名称
);
insert into t2 select * from sourceT;
可以在flink ui界面的jobmanager日志中看到如下输出:
在hive中查看t2_ro,t2_rt表
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://cloud.tencent.com/developer/article/1949358