在实际应用中难免会遇到多个流或批处理程序需要同时 *** 作同一张Hudi表的场景,默认情况下多个程序往同一张Hudi表中写数据时会发生多写冲突造成程序运行失败,要解决并发写问题可以借助Zookeeper实现基于乐观锁的并发写。
使用Spark 3.1.1 Hudi 0.9.0 开启乐观锁并发写功能配置参考:
writer.
.......
//作为分布式锁的zookeeper节点目录
.option(HoodieLockConfig.ZK_base_PATH.key(), "/hudi/write_lock")
//当前分布式锁节点 一般配为表名称
//所有向同一个表中写的程序 ZK_base_PATH/ZK_LOCK_KEY需要一致
.option(HoodieLockConfig.ZK_LOCK_KEY.key(), tableName)
//Zookeeper链接URL
.option(HoodieLockConfig.ZK_CONNECT_URL.key(), "127.0.0.1:2181")
//清理模式设为LAZY 默认写失败的及时回滚、并发写时不适用
.option("hoodie.cleaner.policy.failed.writes","LAZY")
//开启乐观锁并发写功能
.option(HoodieWriteConfig.WRITE_CONCURRENCY_MODE.key(), "OPTIMISTIC_CONCURRENCY_CONTROL")
.......
如果不开启乐观并发写功能,多个任务往同一个Hudi表写数据可能会报:
Exception in thread "main" org.apache.hudi.exception.HoodieIOException: Failed to create file /tmp/xxxx/xxxx/t_table/.hoodie/20211108xxxxx.commit.requested
......
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadExistsException):
/tmp/xxxx/xxxx/t_table/.hoodie/20211108xxxxx.commit.requested for client 10.x.x.x already exists.
......
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)