1、flink单独读取mysql成功
2、flink单独写入hudi成功
3、flink流式读取mysql写入hudi,job创建成功,Hadoop没有创建文件。
如果先用flink往hudi插入一条数据,创建分区成功有数据。
然后执行insert into select ,可以创建成功分区,但是分区没有数据。
CREATE TABLE users_source_mysql(
id BIGINT PRIMARY KEY NOT ENFORCED ,
name STRING,
birthday TIMESTAMP(3),
ts TIMESTAMP(3)
)WITH(
'connector'='mysql-cdc',
'hostname'='localhost',
'port'='3306',
'username'='root',
'password'='ec1001',
'server-time-zone'='Asia/Shanghai',
'debezium.snapshot.mode'='initial',
'database-name'='test',
'table-name'='users'
);
CREATE TABLE users_sink_hudi(
id bigint ,
name string,
birthday TIMESTAMP(3),
ts TIMESTAMP(3),
part VARCHAR(20),
primary key(id) not enforced
)
PARTITIONED BY (part)
with(
'connector'='hudi',
'path'= 'hdfs://node1:8020/hudi-warehouse_hive/users_sink_hudi'
, '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
);
INSERT INTO users_sink_hudi SELECT id,name,birthday,ts,DATE_FORMAT(birthday,'yyyyMMdd') as part FROM users_source_mysql;
hudi-flink-bundle_2.12-0.9.0.jar是hudi打包后生成的,flink-sql-connector-mysql-cdc-1.3.0.jar也在。
1、启动时使用的/usr/flink/flink-1.12.2/bin/sql-client.sh embedded shell,黑马教程说直接这样启动也可以
2、如果启动时我使用/usr/flink/flink-1.12.2/bin/sql-client.sh embedded -j /usr/flink/flink-1.12.2/lib/hudi-flink-bundle_2.12-0.9.0.jar shell,执行insert into select,flink就崩溃了。
3、没有生成分区文件夹,只生成了.hoodie文件夹和里面的文件
1、Running Jobs可以看到创建的任务,一直在运行。
2、查看taskmanager下的Logs,可以看到读取到mysql5条。
但是相比手动插入hudi数据,缺少Sending request : (http://0.0.0.0:46014/v1/hoodie/view/slices/file/latest/?partition=1&basepath=hdfs*******8020%2Fhudi-warehouse%2Fusers_sink_hudi1&fileid=5f681000-5980-4338-8914-75920a658ab4&lastinstantts=20230222183233&timelinehash=b27ae37ac5cf7897fa04ec503d225ad5149d32bdd7d59caa4ae395163910a1dd)
3、没有error和警告日志
根据你提供的信息,可能有以下几个原因导致你的flink程序没有生成分区文件夹,无法写入Hudi:
目标路径不存在或无法写入
请检查定义Hudi表时'path'参数所对应的HDFS路径是否存在,是否有写入权限。如果目录不存在,可以通过hadoop fs -mkdir -p
命令先创建目录。
写入时没有指定分区
在insert into select 语句中,需要手动指定分区字段,例如 insert into users_sink_hudi select id, name, birthday, ts, DATE_FORMAT(birthday,'%Y-%m-%d') as part from users_source_mysql
。根据你提供的代码,你似乎已经指定了分区,也没有出现语法错误。
写入时指定的分区值无效
如果在insert into select语句中指定的分区值无效,比如你指定的'DATE_FORMAT(birthday, 'yyyyMMdd') as part'不符合Hudi分区名称要求,那么Hudi将无法生成对应的分区文件夹。请确保分区值的格式和名称都符合Hudi规定。
修改记录不满足预期的校验规则
Hudi在写入时会对数据进行一定程度的验证,比如根据主键判断数据是否重复。如果写入的数据模式或者数据校验规则与Hudi的预期不一致,可能会导致写入失败。建议在Hudi任务启动时开启日志记录,以便更好地诊断问题。
希望以上的建议对你有所帮助。如果还有问题,请提供更多详细的错误信息或者日志,以便更好地定位问题。
使用教程https://www.cnblogs.com/EnzoDin/p/16036966.html
– magicer 1年前