FlinkCDC+Hudi 无法删改历史数据,谁的锅?

167 阅读2分钟

测试环境:

  • 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。 整个构建过程先不说,结果确让我很奇怪。

  1. 对历史数据无法删改
  2. 对当前日期的数据删没问题。 先说一下过程

MySQL 表结构,里面有11月10号(今天)有上个月10月数据 image.png

1.我们修改id=7 的数据 update users set name='j2ee' where id=7

mysql修改成功

image.png 但是flink sql client 的sink 表变化很奇怪 image.png 显示-U/+U,显示确实捕获了这条变更,但是随后有+I 把原来的“java" insert 了回去。

导致hive 的同步表,没有任何变化,连OP也是等于"I"

image.png

2.删除操作

我们现在直接把id=2 删掉 delete from users where id=2;

image.png 同样的问题,先-D,捕捉到了这条删除,但是随即又插入了原纪录。 hive 表同样任何变化。

3.修改当日的插入的数据(11-10号数据

update users set name='whos_question' where id=25; 这时候就正常的多,捕捉到变化,也插入新得数据。 image.png

hive同步表,也没问题,OP列也显示+U,是一个更新操作。

image.png

那么问题来了: 为什么会出现这种历史 数据无法修改,当前日期却可以修改的问题呢?

是flink的问题还是hudi的问题呢?

只能修改当前日期,不能修改历史数据,所以回滚了?这不符合使用场景啊 还说哪个配置开关的问题?

这个我暂时还没有答案 等我搞明白再来补充

--11月11号补充测试

image.png 第二天我又测了一遍,删除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;`