首页 > 其他分享 >如何不加锁地将数据并发写入Apache Hudi?

如何不加锁地将数据并发写入Apache Hudi?

时间:2023-07-09 16:22:05浏览次数:42  
标签:insert 加锁 Hudi option 写入 bulk hoodie Apache

最近一位 Hudi 用户询问他们是否可以在不需要任何锁的情况下同时从多个写入端写入单个 Hudi 表。 他们场景是一个不可变的工作负载。 一般来说对于任何多写入端功能,Hudi 建议启用锁定配置。 但这是一个有趣的问题,我们进行探索并找到了解决方案,因此与更广泛的社区分享。

需要并发写入的锁提供程序

对于某些场景来说可能是必要的,但可能并不适合所有场景。 因此我们首先看看为什么当并发写入Hudi 或任何表格式时我们需要锁提供程序。 如果两个并发写入修改同一组数据,我们只能允许其中一个成功并中止另一个,因为至少与乐观并发控制(OCC)存在冲突。 我们可以尝试设计和实现基于 MVCC 的模型,但当前还没有做到这一点。 因此仅使用纯 OCC,任何两个并发写入重叠数据都无法成功。 因此为了解决冲突和某些表管理服务,我们需要锁,因为在任何时间点只有其中一个可以操作临界区。 因此我们采用锁提供程序来确保两个写入之间协调此类冲突解决和表管理服务。总结如下

  1. 出于解决冲突的目的,我们不会让两个写入端成功写入重叠的数据。
  2. 对于清理、归档、聚簇等表管理服务,需要协调不同写入端。

那么如果上述两个原因可以放宽呢?

  • 如果工作负载是不可变的,或者不同的写入端写入完全不同的分区,那么真的不需要解决任何冲突。显然声称没有一个写入端重叠这是由用户承担的,因为 Hudi 可能不会做任何冲突解决。
  • 禁用除一个写入端之外的所有写入端的表服务。

不可变的工作负载

不可变的工作负载是关键。 因此建议他们使用 bulk_insert作为操作类型,因为它相当于写入Parquet表。 没有索引查找,没有小文件管理,因此两个写入端不会以任何方式发生冲突。

表服务

Hudi 有一个全局配置,可以在需要时禁用表服务("hoodie.table.services.enabled")。 默认情况下配置设置为 true,因此启动的每个写入端都可能正在执行表服务。但我们可以使用此配置来禁用除一个之外的所有写入端。

元数据表

必须禁用元数据表,因为我们有一个先决条件,即如果有多个写入端,需要锁定元数据表。

本质上其中一个写入端将与所有表服务一起进行摄取,而所有其他写入端只会进行摄取,这可能不会与任何其他写入端重叠。如下是两个写入端的配置。

写入端1

忽略典型的必填字段,如记录键、表名等。这些是必须为写入端 1 设置的配置。

option("hoodie.datasource.write.operation","bulk_insert"). 
option("hoodie.write.concurrency.mode","OPTIMISTIC_CONCURRENCY_CONTROL").
option("hoodie.cleaner.policy.failed.writes","LAZY").
option("hoodie.write.lock.provider","org.apache.hudi.client.transaction.lock.InProcessLockProvider").
option("hoodie.metadata.enable","false").

注意到我们启用了 InProcessLockProvider 并将操作类型设置为"bulk_insert"并禁用了元数据表。

因此写入端将负责清理和归档等表服务。

写入端2

写入端2设置如下

option("hoodie.datasource.write.operation","bulk_insert"). 
option("hoodie.cleaner.policy.failed.writes","LAZY"). 
option("hoodie.metadata.enable","false").
option("hoodie.table.services.enabled","false").

注意到我们禁用了表服务和元数据表,并将操作类型设置为"bulk_insert"。 因此写入端2所做的就是将新数据摄取到表中,而无需担心任何表服务。

小文件管理

如果希望利用小文件管理也可以将写入端1的操作类型设置为"insert"。 如果希望将"insert"作为所有写入的操作类型,则应小心。 如果它们都写入不同的分区,那么它可能会起作用。 但如果它们可能写入相同的分区,则可能会导致意想不到的后果,需要避免。

或者我们可以将操作类型保留为"bulk_insert",但使用写入端1启用聚簇来合并小文件,如下所示:

option("hoodie.datasource.write.operation","bulk_insert"). 
option("hoodie.write.concurrency.mode","OPTIMISTIC_CONCURRENCY_CONTROL").
option("hoodie.cleaner.policy.failed.writes","LAZY").
option("hoodie.write.lock.provider","org.apache.hudi.client.transaction.lock.InProcessLockProvider").
option("hoodie.metadata.enable","false").
option("hoodie.clustering.inline","true").
option("hoodie.clustering.inline.max.commits","4").

为两个并发 Spark 写入端尝试上述一组配置,并使用清理和归档设置进行了 100 多次提交测试。 还进行故障演练并且事物完好无损。 输入数据与两个写入端从 Hudi 读取的快照相匹配。

结论

如果用例符合前面提到的约束,这将非常有助于提高 Hudi 写入的吞吐量。不必为锁提供者管理基础设施也将减轻操作负担。

标签:insert,加锁,Hudi,option,写入,bulk,hoodie,Apache
From: https://www.cnblogs.com/leesf456/p/17538883.html

相关文章

  • apache日志切割和保持访问
    日志切割的作用和方式Centos01切换云计算光盘安装apache编译安装优化apache命令生成服务控制文件添加执行权限修改服务控制文件添加到系统服务设置开机自动启动服务修改网站主页切换系统盘生成验证数据库修改apache主配置文件加载基本身份验证功能重启服务日志切割(rotatelogs)登陆一......
  • Debian 12安装配置Apache2.4 + PHP8.0 + MySQL5.7常见问题记录
    1.Apache2.4安装1.1浏览器访问提示502错误正常通过sudoaptinstallapache2安装,安装完成通过systemctlstatusapache2查看运行状态正常,但浏览器访问IP地址提示502错误解决:问题大概率出自服务器防火墙#查看防火墙规则列表sudoufwapplist#Web服务器相关条目#>WW......
  • 浅谈Apache与CVE-2023-20860
    一、前言  一般情况下,开发者配置鉴权时,可能都会遵循一个原则,就是"优先使用/**认证兜底,明确哪些接口无需认证,而不是明确哪些接口需要认证。  在SpringController中,以下两个路由访问是等价的(熟悉springframework源码的话,会知道其实都是在解析pattern前做了补全的处理(不论是......
  • Apache DolphinScheduler 荣获“掘进技术引力榜”「2023 年度 ROBUST 开源项目」奖项!
    经过紧张激烈的投票和严格的专家评审环节,“掘进技术引力榜”活动在上周的稀土掘金开发者大会上公布了「2023年度ROBUST开源项目」奖项的获奖名单,ApacheDolphinScheduler名列其中。ApacheDolphinScheduler代表上台领奖(右三)掘金技术引力榜「2023年度ROBUST开源项目」奖......
  • 盘点2021年Apache年报中出现的国产项目
    盘点2021年Apache年报中出现的国产项目:ShardingSphere,IoTDB,CarbonData,Eagle,Kylin,Apisix,DolphinSchedulerandEcharts1、引言2021年8月31日,Apache软件基金会发布2021财年(2020年5月1日-2021年4月30日)年度报告,报告内容由Apache软件基金会概览、......
  • Failed to instantiate [org.apache.tomcat.jdbc.pool.DataSource]
    问题:项目中没有使用db相关的东西,但是在应用启动时报错:Failedtoinstantiate[org.apache.tomcat.jdbc.pool.DataSource]原因:  pom.xml中配置了和数据库相关的,SpringBoot启动默认会加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration类,DataSo......
  • org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the sp
    环境和所需包:      1,JDK1.5      2,poi-3.5-FINAL-20090928.jar,           poi-contrib-3.5-FINAL-20090928.jar,           poi-ooxml-3.5-FINAL-20090928.jar,           poi-scratchpad-3.5-FINAL-20090928.jar,        ......
  • org.apache.log4j.Logger
    Log4j 简介Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j ,我们可以控制日志信息输送的目的地是控制台、文件、 GUI 组件、甚至是套接口服 务器、 NT 的事件记录器、 UNIXSyslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别......
  • Apache Commons IO
    ​ CommonsIO是ApacheCommons的子项目,提供了对IO操作的封装和扩展,包括文件操作、流操作、文件拷贝等,简化了JavaIO的使用。 CommonsIO是一个用于处理输入输出的常用Java库。它提供了一些常见且有用的实用方法,简化了文件操作、流操作和其它与输入输出相关的任务。要使......
  • Apache Commons IO
    ​ CommonsIO是ApacheCommons的子项目,提供了对IO操作的封装和扩展,包括文件操作、流操作、文件拷贝等,简化了JavaIO的使用。 CommonsIO是一个用于处理输入输出的常用Java库。它提供了一些常见且有用的实用方法,简化了文件操作、流操作和其它与输入输出相关的任务。要使......