Starrocks的主键表涉及到的MOR Delete+Insert更新策略

背景

写这个文章的作用主要是做一些总结和梳理,特别是正对大数据场景下的实时写入更新策略 COWMOR 以及 Delete+Insert 的技术策略的演进,
这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table.

分析总结

Starrocks 的主键表主要是用来加速实时更新的效率,以及在做Adhoc查询的时候能够加速查询速度。在paimon等数据表格式中,一开始都是采用的MOR的策略来达到实时写入的目的,但是在读取的时候,就得进行合并的操作才能获取真正的数据,这种方式虽然能加速数据的写入速度,但是在读取的时候就会比较慢,采用Delete+Insert的方式,只会在写入的时候在DelVector增加一个标志位,读取的时候,只读最新的数据即可。大大的缩短了,数据读取的时间。

Starrocks的Unique表和Aggreate表采用的是 MOR 的策略,这个会存在读放大的问题。除此之外,由于存在Merge操作,谓词和索引也不能下推到底层的数据源中,即使下推了,也不能起到过滤的作用,这个严重的影响到了查询的效率。

对于Starrocks的主键索引,读写主键表的路程如下(参考Starrocks的官方文档):

  • 对于写: Starrocks 先把对应的tablets的主键索引加载到内存,对于删除操作,Starrocks首先使用主键索引找到每行对应的数据位置,并在DelVector中把数据行标记为删除。对于更新操作,会转换为Delete + insert操作,除了在DelVector增加删除标志外,还会写入最新的数据,同时主键索引也会被更新。
    在这里插入图片描述

  • 对于读: 由于历史的数据在写入的时候,已经被标志为了删除,所以只需要读取主键索引对应的信息就可以了,历史数据不需要再进行合并了。并且当底层的数据扫描的时候,可以利用谓词以及各种索引去减少扫描的数据量。因此查询性能得到大大的提升。
    在这里插入图片描述

注意:

  1. DelVector 是 Rowset 级别的
  2. 主键索引会记录pk到rowsetId + segementId + rowId的映射关系
<think>嗯,用户想了解Hudi API,我需要先回忆一下Hudi的基本概念。Hudi是Apache的一个开源数据管理框架,主要用于大数据处理,特别是增量数据处理和数据湖管理。用户可能是在处理大数据时遇到了需要高效更新、删除或增量处理的需求,所以想了解Hudi的API如何使用。 首先,Hudi提供了两种主要的API:Write API和Read API,可能还有其他的比如DeltaStreamer,但用户可能最关心的是核心的读写API。需要分别介绍这两种API的功能和使用场景,以及它们对应的类和方法。 Write API方面,Hudi有COW和MOR两种类型,对应的写入方式不同,要解释清楚这两种类型的区别,比如COW是拷贝覆盖,适合写多读少,MOR是读优化和实时视图,适合频繁写入。然后提到HoodieWriteClient这个类,以及如何配置参数,比如设置存储路径、名、Schema等。可能还需要提到Hudi支持upsert、insert、bulk_insert等操作,用户可以通过这些操作来管理数据的变化。 接下来是Read API,用户可能想了解如何读取Hudi数据,比如快照查询、增量查询和读取优化查询。需要说明如何通过HoodieReadClient来实现这些查询,以及不同查询类型的适用场景,比如增量查询用于获取某个时间点后的变数据。 然后要提到Hudi的其他API,比如DeltaStreamer工具,用于从外部源如Kafka导入数据,可能用户有实时数据摄入的需求。还有Hudi的Flink集成,如果用户使用Flink作为流处理引擎,这部分内容也很重要,需要简要说明。 在注意事项部分,需要提醒用户正确配置Hudi,比如选择存储类型(COW/MOR),合理设置主键和时间戳字段,以及数据合并的小文件处理策略。这些都是实际使用中容易遇到的问题,提前说明可以帮助用户避免常见错误。 可能用户是开发者,需要具体的代码示例,但问题中没有明确要求代码,不过根据系统指令,用户不可见层的行内数学达式要用$...$,但这里讨论的是API,可能不需要数学公式。需要确保回答结构清晰,分点说明,帮助用户逐步了解Hudi API的结构和使用方法。 最后检查是否覆盖了所有主要API,是否有遗漏的部分,比如Hudi的索引机制或者与查询引擎(如Spark、Hive、Presto)的集成,但用户的问题集中在API上,可能不需要深入这些细节。保持回答简洁,重点突出核心API的功能和使用场景,以及最佳实践建议,这样用户能够快速上手并应用到实际项目中。</think>Hudi(Apache Hudi)是一个开源数据管理框架,专为高效处理大规模数据湖的增量更新、删除和查询而设计。其API提供了对数据湖的核心操作支持,以下是其关键API的层级化介绍: --- ### 一、Write API(写入层) **功能**:支持插入(Insert)、更新(Update)、删除(Delete)及增量处理(Upsert)操作。 1. **核心类** - **`HoodieWriteClient`**:负责与Hudi的交互,封装了写入逻辑。 - **配置示例**: ```java HoodieWriteConfig config = HoodieWriteConfig.newBuilder() .withPath("/path/to/hudi_table") .withSchema(schema) .build(); ``` 2. **操作类型** - **Copy-on-Write(COW)** 直接覆盖数据文件,适合低频更新、高频查询场景。 - **Merge-on-Read(MOR)** 将更新写入日志文件,适合高频写入场景,需合并日志和基础文件进行读取。 3. **写入模式** ```java // Upsert操作示例 JavaRDD<HoodieRecord> records = ...; // 待写入数据 HoodieWriteClient.write(records, commitTime); ``` --- ### 二、Read API(读取层) **功能**:支持多种查询模式,包括快照查询、增量查询和实时视图。 1. **核心类** - **`HoodieReadClient`**:用于执行查询操作。 2. **查询类型** - **快照查询(Snapshot Query)** 返回最新提交后的全量数据: ```scala spark.read.format("hudi").load("/path/to/hudi_table") ``` - **增量查询(Incremental Query)** 获取某时间点后的增量数据: ```sql SELECT * FROM hudi_table WHERE _hoodie_commit_time > '2023-10-01' ``` - **读取优化查询(Read Optimized Query)** 针对MOR,直接读取基础文件(非实时视图)。 --- ### 三、其他关键API 1. **DeltaStreamer工具** 用于从Kafka等外部源持续导入数据: ```bash hudi-delta-streamer \ --source-class org.apache.hudi.utilities.sources.JsonKafkaSource \ --target-base-path /path/to/hudi_table \ --table-type COPY_ON_WRITE ``` 2. **Flink集成** 支持流式写入: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.addSource(new FlinkKafkaSource(...)) .addSink(new HoodieFlinkStreamer(...)); ``` --- ### 四、注意事项 1. **存储类型选择** - 高频更新场景选择MOR,低频更新选择COW。 2. **主键配置** 必须指定主键字段(`hoodie.datasource.write.recordkey.field`)。 3. **小文件合并** 通过`hoodie.parquet.small.file.limit`配置优化文件大小。 --- ### 五、典型应用场景 - **CDC(变数据捕获)**:通过Upsert实现近实时数据同步。 - **数据回溯**:利用时间旅行(Time Travel)查询历史版本。 - **合规删除**:通过Delete API满足GDPR要求。 通过合理使用Hudi API,可显著提升数据湖的更新效率和查询性能,同时降低存储成本。建议结合Spark/Flink等计算引擎进一步优化处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值