测试环境:
- Flink1.13.0
- Scala2.11
- CDH6.2.0
- Hadoop3.0.0
- Hive2.1.1
- Hudi0.10(master)
- PrestoDB0.27
- Mysql5.7
最近在测flinkCDC捕获mysql变更数据,sink 到hudi,然后自动同步到hive。 整个构建过程先不说,结果确让我很奇怪。
- 对历史数据无法删改
- 对当前日期的数据删没问题。 先说一下过程
MySQL 表结构,里面有11月10号(今天)有上个月10月数据
1.我们修改id=7 的数据 update users set name='j2ee' where id=7
mysql修改成功
但是flink sql client 的sink 表变化很奇怪
显示-U/+U,显示确实捕获了这条变更,但是随后有+I 把原来的“java" insert 了回去。
导致hive 的同步表,没有任何变化,连OP也是等于"I"
2.删除操作
我们现在直接把id=2 删掉 delete from users where id=2;
同样的问题,先-D,捕捉到了这条删除,但是随即又插入了原纪录。
hive 表同样任何变化。
3.修改当日的插入的数据(11-10号数据
update users set name='whos_question' where id=25;
这时候就正常的多,捕捉到变化,也插入新得数据。
hive同步表,也没问题,OP列也显示+U,是一个更新操作。
那么问题来了: 为什么会出现这种历史 数据无法修改,当前日期却可以修改的问题呢?
是flink的问题还是hudi的问题呢?
只能修改当前日期,不能修改历史数据,所以回滚了?这不符合使用场景啊 还说哪个配置开关的问题?
这个我暂时还没有答案 等我搞明白再来补充
--11月11号补充测试
第二天我又测了一遍,删除11月10号的数据和10月12号的数据
问题依旧,前一天的数据成功删除,较早的历史数据删除-D之后又insert
这是什么鬼啊
附上我的建表语句
`-----------sql ---------------
--SOURCE TABLE
CREATE TABLE mysql_users (
id BIGINT PRIMARY KEY NOT ENFORCED ,
name STRING,
birthday TIMESTAMP(3),
ts TIMESTAMP(3)
)
with
('connector'='mysql-cdc'
,'hostname'='xxxx'
,'port'='3306'
,'username'='xxx'
,'password'='xxx'
,'debezium.snapshot.mode'='initial'
,'database-name'='flink_cdc_test'
,'table-name'='users')
--SINK TABLE
CREATE TABLE users_mor_sync2hive01(
id bigint ,
name string,
birthday TIMESTAMP(3),
ts TIMESTAMP(3),
partition
VARCHAR(20),
primary key(id) not enforced
)partitioned by (partition string)
with(
'connector'='hudi',
'path'= 'hdfs://nameservice1/hudidatas/hudi-warehouse/users_mor_sync2hive01'
, 'hoodie.datasource.write.recordkey.field'= 'id'
, 'write.precombine.field'= 'ts'
, 'write.tasks'= '1'
, 'compaction.tasks'= '1'
, 'write.rate.limit'= '2000'
, 'table.type'= 'MERGE_ON_READ'
, 'compaction.async.enabled'= 'true'
, 'compaction.trigger.strategy'= 'num_commits'
, 'compaction.delta_commits'= '1'
, 'changelog.enabled'= 'true'
, 'read.streaming.enabled'= 'true'
, 'read.streaming.check-interval'= '3'
, 'hive_sync.enable'= 'true'
, 'hive_sync.mode'= 'hms'
, 'hive_sync.metastore.uris'= 'thrift://XXXX:9083'
-- , 'hive_sync.jdbc_url'= 'jdbc:hive2://hadoop:10000'
, 'hive_sync.table'= 'users_mor_sync2hive01'
, 'hive_sync.db'= 'hudi2hive'
, 'hive_sync.username'= ''
, 'hive_sync.password'= ''
, 'hive_sync.support_timestamp'= 'true'
);
INSERT INTO users_mor_sync2hive01 SELECT *, DATE_FORMAT(birthday, 'yyyyMMdd') FROM mysql_users;`