Flink1.13.1
Scala2.11
CDH6.2.0
Hadoop3.0.0
Hive2.1.1
Hudi0.10(master)
PrestoDB0.256
Mysql5.7
export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
export HADOOP_CALSSPATH=`$HADOOP_HOME/bin/hadoop classpath`
说明:指定aliyun maven地址(支持CDH cloudera依赖) mirror库
alimaven
central,!cloudera
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
git clone https://github.com/apache/hudi.git
hudi0.9 适配 flink1.12.2
hudi0.10(master) 适配 flink1.13.X ( 说明master分支上版本还未release)
hudi-master/packaging/hudi-flink-bundle
pom.xml文件 ( 笔者环境CDH6.2.0 hive2.1.1)
flink-bundle-shade-hive2
2.1.1-cdh6.2.0
compile
${hive.groupid}
hive-service-rpc
${hive.version}
${flink.bundle.hive.scope}
mvn clean install -DskipTests-Drat.skip=true-Dscala-2.11-Dhadoop.version=3.0.0-Pflink-bundle-shade-hive2
(可加 –e –X 参数查看编译ERROR异常和DEBUG信息)
说明:默认scala2.11、默认不包含hive依赖
首次编译耗时较长 笔者首次编译大概花费 50min+(也和服务器网络有关)
后续编译会快一些 大约15min左右
修改Hudi master pom.xml 增加 CDH repository地址
hudi-master/packaging/hudi-flink-bundle/target
hudi-flink-bundle_2.11-0.10.0-SNAPSHOT.jar
说明:hudi-flink-bundle jar 是 flink 用来写入和读取数据
hudi-master/packaging/hudi-hadoop-mr-bundle/target
hudi-hadoop-mr-bundle-0.10.0-SNAPSHOT.jar
说明:hudi-mr-bundle jar 是 hive 需要用来读hudi数据
版本说明:Flink 1.13.1 scala2.11版本
# state.backend: filesystem
state.backend: rocksdb
# 开启增量checkpoint
state.backend.incremental: true
# state.checkpoints.dir: hdfs://namenode-host:port/flink-checkpoints
state.checkpoints.dir: hdfs://nameservice/flink/flink-checkpoints
classloader.check-leaked-classloader: false
classloader.resolve-order: parent-first
flink-sql-connector-mysql-cdc-1.4.0.jar
flink-sql-connector-oracle-cdc-2.1-SNAPSHOT.jar.BAK – oracle cdc 依赖
flink-format-changelog-json-1.4.0.jar
flink-sql-connector-kafka_2.11-1.13.1.jar
--- Hadoop home lib下copy过来
hadoop-mapreduce-client-common-3.0.0-cdh6.2.0.jar
hadoop-mapreduce-client-core-3.0.0-cdh6.2.0.jar
hadoop-mapreduce-client-jobclient-3.0.0-cdh6.2.0.jar
--- hudi编译jar copy过来
hudi-flink-bundle_2.11-0.10.0-SNAPSHOT.jar
说明:目前oracle cdc jar和mysql cdc jar一起在lib下发现有冲突异常
$FLINK_HOME/bin/yarn-session.sh -s 2-jm 2048-tm 2048-nm ys-hudi01 -d
$FLINK_HOME/bin/sql-client.sh embedded -j ./lib/hudi-flink-bundle_2.11-0.10.0-SNAPSHOT.jar shell
说明:-j指定hudi-flink 依赖jar
Show table /show catalogs
mkdir logs
chown -R mysql:mysql /mysqldata/logs
vim /etc/my.cnf
server-id=2
log-bin= /mysqldata/logs/mysql-bin
binlog_format=row
expire_logs_days=15
binlog_row_image=full
service mysqld restart
show master logs;
Mysql 版本:5.7.30
create table users_cdc(
id bigint auto_increment primary key,
name varchar(20) null,
birthday timestamp default CURRENT_TIMESTAMP notnull,
ts timestamp default CURRENT_TIMESTAMP notnull
);
CREATE TABLE mysql_users (
id BIGINT PRIMARY KEY NOT ENFORCED ,
name STRING,
birthday TIMESTAMP(3),
ts TIMESTAMP(3)
) WITH (
'connector'= 'mysql-cdc',
'hostname'= '127.0.0.1',
'port'= '3306',
'username'= '',
'password'=’’,
'server-time-zone'= 'Asia/Shanghai',
'debezium.snapshot.mode'='initial',
'database-name'= 'luo',
'table-name'= 'users_cdc'
);
Flink SQL> select * from mysql_users;
由于目前MySQL users_cdc表是空,所以flinksql 查询没有数据 只有表结构;
Flink web UI:
Flink SQL> create view mycdc_v AS SELECT *, DATE_FORMAT(birthday, 'yyyyMMdd') as partition
FROM mysql_users;
说明:partition 关键字需要 `` 引起来
查询视图数据也是空结构,但增加了分区字段:
Flink SQL> select * from mycdc_v;
Flink web UI:
建议:测试环境 可设置秒级别(不能太小),生产环境可设置分钟级别。
Flink SQL> set execution.checkpointing.interval=30sec;
CREATE TABLE mysqlcdc_sync_hive01(
id bigint ,
name string,
birthday TIMESTAMP(3),
ts TIMESTAMP(3),
`partition` VARCHAR(20),
primary key(id) not enforced --必须指定uuid 主键
)
PARTITIONED BY (`partition`)
with(
'connector'='hudi',
'path'= 'hdfs://nameservice /luo/hudi/mysqlcdc_sync_hive01'
, 'hoodie.datasource.write.recordkey.field'= 'id'-- 主键
, 'write.precombine.field'= 'ts'-- 自动precombine的字段
, 'write.tasks'= '1'
, 'compaction.tasks'= '1'
, 'write.rate.limit'= '2000'-- 限速
, 'table.type'= 'MERGE_ON_READ'-- 默认COPY_ON_WRITE,可选MERGE_ON_READ
, 'compaction.async.enabled'= 'true'-- 是否开启异步压缩
, 'compaction.trigger.strategy'= 'num_commits'-- 按次数压缩
, 'compaction.delta_commits'= '1'-- 默认为5
, 'changelog.enabled'= 'true'-- 开启changelog变更
, 'read.streaming.enabled'= 'true'-- 开启流读
, 'read.streaming.check-interval'= '3'-- 检查间隔,默认60s
, 'hive_sync.enable'= 'true'-- 开启自动同步hive
, 'hive_sync.mode'= 'hms'-- 自动同步hive模式,默认jdbc模式
, 'hive_sync.metastore.uris'= 'thrift://hadoop:9083'-- hive metastore地址
-- , 'hive_sync.jdbc_url'= 'jdbc:hive2://hadoop:10000'-- hiveServer地址
, 'hive_sync.table'= 'mysqlcdc_sync_hive01'-- hive 新建表名
, 'hive_sync.db'= 'luo'-- hive 新建数据库名
, 'hive_sync.username'= ''-- HMS 用户名
, 'hive_sync.password'= ''-- HMS 密码
, 'hive_sync.support_timestamp'= 'true'-- 兼容hive timestamp类型
);
(1) Copy on Write:使用列式存储来存储数据(例如:parquet),通过在写入期间执行同步合并来简单地更新和重现文件
(2) Merge on Read:使用列式存储(parquet)+行式文件(arvo)组合存储数据。更新记录到增量文件中,然后进行同步或异步压缩来生成新版本的列式文件。
COW:Copy on Write (写时复制),快照查询+增量查询
MOR:Merge on Read (读时合并),快照查询+增量查询+读取优化查询(近实时)
使用场景上:
(1)COW适用写少读多的场景 ,MOR 适用写多读少的场景;
(2)MOR适合CDC场景,更新延迟要求较低,COW目前不支持 changelog mode 不适合处理cdc场景;
Flink web UI
Flink SQL> insert into mysqlcdc_sync_hive01 select id,name,birthday,ts,partition
from mycdc_v;
Flink web UI DAG图:
说明:目前还没写入测试数据,hudi目录只生成一些状态标记文件,还未生成分区目录以及.log 和.parquet数据文件,具体含义可见hudi官方文档。
insert into users_cdc (name) values ('cdc01');
Flink SQL> set execution.result-mode=tableau;
[WARNING] The specified key 'execution.result-mode' is deprecated. Please use 'sql-client.execution.result-mode' instead.
[INFO] Session property has been set.
Flink SQL> select * from mysql_users; -- 查询到一条insert数据
Flink SQL> select * from mysqlcdc_sync_hive01; --已查询到一条insert数据
hive> show create table mysqlcdc_sync_hive01_ro;
hive> show create table mysqlcdc_sync_hive01_rt;
hive> show partitions mysqlcdc_sync_hive01_ro;
hive> show partitions mysqlcdc_sync_hive01_rt;
说明:已自动生产hudi MOR模式的
mysqlcdc_sync_hive01_ro
mysqlcdc_sync_hive01_rt
ro 表全称 read oprimized table,对于 MOR 表同步的 xxx_ro 表,只暴露压缩后的 parquet。其查询方式和COW表类似。设置完 hiveInputFormat 之后 和普通的 Hive 表一样查询即可;
rt表示增量视图,主要针对增量查询的rt表;
ro表只能查parquet文件数据, rt表 parquet文件数据和log文件数据都可查;
说明:需要引入hudi-hadoop-mr-bundle-0.10.0-SNAPSHOT.jar
(1) 引入到 $HIVE_HOME/lib下;
(2) 引入到$HIVE_HOME/auxlib 自定义第三方依赖 修改 hive-site.xml配置文件;
(3) Hive shell命令行引入 Session级别有效;
其中(1)和(3)配置完后需要重启 hive-server服务;
hive> select * from mysqlcdc_sync_hive01_ro; --已查询到mysq insert的一条数据
hive> select * from mysqlcdc_sync_hive01_rt; --已查询到mysq insert的一条数据
hive> select name,ts from mysqlcdc_sync_hive01_ro where partition
='20211109';
hive> select count(1) from mysqlcdc_sync_hive01_ro;
引入hudi-hadoop-mr-bundle-0.10.0-SNAPSHOT.jar依赖
hive> add jar hdfs://nameservice /luo/hudi-hadoop-mr-bundle-0.10.0-SNAPSHOT.jar;
hive> set hive.input.format = org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat;
hive> select count(1) from mysqlcdc_sync_hive01_ro; --可正常count
hive> select count(1) from mysqlcdc_sync_hive01_rt;
说明:rt 表count 还是异常,和Hudi社区人员沟通hudi master目前还没release这块存在bug正在修复中
具体见:https://issues.apache.org/jira/browse/HUDI-2649
insert into users_cdc (name) values ('cdc02');
insert into users_cdc (name) values ('cdc03');
insert into users_cdc (name) values ('cdc04');
insert into users_cdc (name) values ('cdc05');
insert into users_cdc (name) values ('cdc06');
Flink web UI DAG中数据链路情况:
(1)requested:表示一个动作已被安排,但尚未启动
(2)inflight:表示当前正在执行操作
(3)completed:表示在时间线上完成了操作
update users_cdc set name = 'cdc05-bj'where id = 5;
说明:flinksql 查询最终只有一条+I有效数据,且数据已更新
Flink web UI DAG接受到两条binlog数据,但最终compact和sink只有一条有效数据
deletefrom users_cdc where id = 3;
(1)commits: 表示将一批数据原子性写入表中
(2)cleans: 清除表中不在需要的旧版本文件的后台活动
(3)delta_commit:增量提交是指将一批数据原子性写入MergeOnRead类型的表中,其中部分或者所有数据可以写入增量日志中
(4)compaction: 协调hudi中差异数据结构的后台活动,例如:将更新从基于行的日志文件变成列格式。在内部,压缩的表现为时间轴上的特殊提交
(5)rollback:表示提交操作不成功且已经回滚,会删除在写入过程中产生的数据
说明:hudi分区文件以及.log和.parquet文件都已生成
两种文件区别:Hudi会在DFS分布式文件系统上的basepath基本路径下组织成目录结构。每张对应的表都会成多个分区,这些分区是包含该分区的数据文件的文件夹,与hive的目录结构非常相似。在每个分区内,文件被组织成文件组,文件id为唯一标识。每个文件组包含多个切片,其中每个切片包含在某个提交/压缩即时时间生成的基本列文件(parquet文件),以及自生成基本文件以来对基本文件的插入/更新的一组日志文件(*.log)。Hudi采用MVCC设计,其中压缩操作会将日志和基本文件合并成新的文件片,清理操作会将未使用/较旧的文件片删除来回收DFS上的空间。
设置30s 一次
hive> select * from mysqlcdc_sync_hive01_ro;
hive> select * from mysqlcdc_sync_hive01_rt;
hudi-master/hudi-cli/hudi-cli.sh
hudi->connect --path hdfs://nameservice1/tmp/luo/hudi/mysqlcdc_sync_hive01
hudi:mysqlcdc_sync_hive01->commits show --sortBy "CommitTime"
查看Hudi compactions 计划hudi:mysqlcdc_sync_hive01->compactions show all
PrestoDB 集群配置和hive集成参考PrestoDB官网
presto-server-***/etc/catalog/hive.properties 配置hive catalog