将hudi同步到配置kerberos的hive3

2022-03-03 08:46:13 浏览数 (1)

前人种树,后人乘凉。本文基于社区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

0 人点赞