更新时间:2024-11-29 GMT+08:00

分区并发控制

分区并发写每个任务基于对当前存在inflight状态的commit中存储的修改分区信息来判断是否存在写冲突,从而实现并发写入。

并发过程中的锁控制基于ZK锁实现,无需用户配置额外参数。

注意事项

分区并发写控制基于单表并发写控制的基础上实现,因此使用约束条件与单表并控制写基本相同。

当前分区并发只支持Spark方式写入,Flink不支持该特性。

为避免过大并发量占用ZooKeeper过多资源,对Hudi在ZooKeeper上增加了Quota配额限制,可以通过服务端修改Spark组件中参数zk.quota.number来调整Hudi的Quota配额,默认为500000,最小为5,且不可通过此参数来控制并行任务数,仅用来控制对ZooKeeper的访问压力。

使用分区并发机制

通过设置参数:hoodie.support.partition.lock=true来启动分区并发写。

示例:

spark datasource方式开启分区并发写:

upsert_data.write.format("hudi").
option("hoodie.datasource.write.table.type", "COPY_ON_WRITE").
option("hoodie.datasource.write.precombine.field", "col2").
option("hoodie.datasource.write.recordkey.field", "primary_key").
option("hoodie.datasource.write.partitionpath.field", "col0").
option("hoodie.upsert.shuffle.parallelism", 4).
option("hoodie.datasource.write.hive_style_partitioning", "true").
option("hoodie.support.partition.lock", "true").
option("hoodie.table.name", "tb_test_cow").
mode("Append").save(s"/tmp/huditest/tb_test_cow")

spark-sql开启分区并发写:

set hoodie.support.partition.lock=true;
insert into hudi_table1 select 1,1,1;