mysql+flinkCDC+hudi

一、准备事项

1.需要一个Hadoop集群,分布式,单节点,伪分布式都可以。

2.flink官网下载,下载的版本参照hudi官网 https://hudi.apache.org/docs/quick-start-guide/
本文使用版本  flink1.13.6+hudi0.10.1


注意:
1.需要将在$FLINK_HOME/conf/flink-conf.yaml,添加配置taskmanager.numberOfTaskSlots: 4  (大于4就行,我这里设置10),$FLINK_HOME/conf/worker  设置为节点名,复制几下,我这里设置3个Hadoop01(注:Hadoop01是我的节点名,请根据实际情况修改)。实际启动的slots数为10x3=30个。
2.需要flink-connector-mysql-cdc-1.4.0.jar 即mysql-cdc连接器放到flink 的 lib下。

3.mysql需要开启binlog日志,需要修改/etc/my.cnf文件,加上如下两段代码。

server-id=1
log-bin=mysql-bin    


二.、启动flink

进入flink的bin目录,执行

export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath`
 
#启动flink
./start-cluster.sh

export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath`

#启动flinksql   注意./lib/hudi-flink-bundle_2.11-0.10.1.jar换成自己下载的hudi路径
./sql-client.sh embedded -j ./lib/hudi-flink-bundle_2.11-0.10.1.jar shell

需要注意的点,4、5点 非项目需要可忽略
1.启动flinksql以后,需要手动设置checkpoint时间 set execution.checkpointing.interval=10sec;
2.hudi自动压缩成parquet文件,但是受参数影响,默认导入五次才压缩,需要加参数调整到一次让他压缩  'compaction.delta_commits'= '1',
3.采用FlinkCDC流式写入Hudi的方式,在数据量大或数据量瞬间激增的情况下频繁写入导致datanode挂掉,需要加限流参数(write.rate.limit)来控制
4.flink作业取消作业时会默认删除checkpoint文件,为了方便作业回滚、重启,可以设置取消时保留checkpoint文件。
set execution.checkpointing.externalized-checkpoint-retention= RETAIN_ON_CANCELLATION;
5.通过execution.savepoint.path指定savepoint/checkpoint路径,然后触发作业,该作业就会从savepoint/checkpoint重启。需要注意的是所设置的参数在flink sql client session生命周期内有效,无法unset。只能重启client来清楚设置。
set 'execution.savepoint.path'='hdfs:///tmp/flink/checkpoints/k-3'


三、自由发挥时间

####创建mysql数据库连接

CREATE TABLE mysql_binlog2 (
name STRING ,
cust_id INT PRIMARY KEY NOT ENFORCED,
age INT
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'hadoop01',    --mysql数据库所在ip地址
'port' = '3306',     
'username' = 'root',        --账号
'password' = 'pwdd',        --密码
'server-time-zone' = 'Asia/Shanghai',
'debezium.snapshot.mode'='initial',    --读取方式,增量,全量
'database-name' = 'FlinkCDC',    --需要读取的数据库
'table-name' = 'person'     --需要读取的表
);




##创建hudi表,落地文件到hdfs上,参数视个人情况添加

create table hudi_test_1(
name STRING ,
cust_id INT,
age INT,
dt VARCHAR(20),
primary key(cust_id) not enforced
)PARTITIONED BY (dt)
with(
'connector'='hudi',
'path' = 'hdfs://hadoop02:8020/hudi/hudi_mysql_hive/',
'hoodie.datasource.write.recordkey.field'='cust_id',    --主键
'hoodie.parquet.max.file.size'='268435456',   --Hudi 写入阶段生成的 parquet 文件的大小
'write.precombine.field'='dt',   --时间记录,用于覆盖数据,当两个记录具有相同的键值时,将选择一个值最大的记录
'write.tasks'='1',  --执行实际写入的任务的并行度
'write.bucket_assign.tasks'='1',  --执行桶分配的任务的并行性,默认是执行环境的并行性。
'write.task.max.size'='1024',  --写入任务的最大内存(以MB为单位),当阈值达到时,它会刷新最大大小的数据桶以避免ooM,默认1G
'write.rate.limit'='30000',   --写入限制,每秒写入记录速率限制,以防止流量抖动并提高稳定性,默认为0(无限制)
'table.type'='MERGE_ON_READ',  
'compaction.tasks'='1',  --执行实际压缩的任务的并行性,默认为4。
'compaction.async.enabled'='true',  --开启自动压缩
'compaction.delta_commits'='1',  --通过提交数确定是否启动压缩,启动压缩所需的MAX Delta提交,默认为5提交
'compaction.max_memory'='500',  --用于压缩可溢出映射的最大内存(MB)
'changelog.enabled'='true',  --是否保留所有中间更改
'read.streaming.enabled'='true', --开启流式读
'read.streaming.check.interval'='3',
'hive_sync.enable'='true',  --将Hive meta异步同步到hms,默认为false
'hive_sync.mode'='hms',  
'hive_sync.metastore.uris'='thrift://hiveserver2:9083',  --hive的uri
'hive_sync.db'='test',  --hive数据库
'hive_sync.table'='hudi_test_1', --hive表
'hive_sync.username'='flinkcdc',  --hive 同步的用户名
'hive_sync.support_timestamp'='true'   --具有原始类型 TIMESTAMP_MICROS 的 INT64 转换为 hive 时间戳类型
);



##flinkCDC读取mysql数据写到hudi

insert into hudi_test_1 select *,date_format(now(),'yyyyMMdd') from mysql_binlog2

##查看数据写入情况

select * from hudi_test_1; --小数据量

select count(1) from  hudi_test_1;  --大数据量



猜你喜欢

转载自blog.csdn.net/qq_40788398/article/details/124040108