cow、mor与mow

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: cow、mor与mow

COW、MOR、MOW

COW
copy on write,写时拷贝。在COW表中,只有数据文件/基本文件(.parquet),    没有增量文件(.log)

它是在数据写入的时候,复制一份原来的拷贝,在其基础上添加新数据,创建数据文件的新版本(新的FileSlice)。新版本文件包括旧版本文件的记录以及来自传入批次的记录(全量最新)。

正在读数据的请求,读取的是最近的完整副本,这类似Mysql 的MVCC的思想

流程示例:

设我们有 3 个文件组,其中包含如下数据文件。

我们进行一批新的写入,在索引后,我们发现这些记录与File group 1 和File group 2 匹配,然后有新的插入,我们将为其创建一个新的文件组(File group 4)。




MOR
merge on read读时合并。在MOR表中,可能包含列式存储的基本文件(.parquet)和行存的增量日志文件(一定会有)(基于行的avro格式,.log.*)。
新插入的数据存储在delta log 中,定期再将delta log合并进行parquet数据文件。读取数据时,会将delta log跟老的数据文件做merge。

合并成本从写入端转移到读取端。因此在写入期间我们不会合并或创建较新的数据文件版本。标记/索引完成后,对于具有要更新记录的现有数据文件,Hudi 创建增量日志文件并适当命名它们,以便它们都属于一个文件组。

读取端将实时合并基本文件及其各自的增量日志文件。你可能会想到这种方式,每次的读取延迟都比较高(因为查询时进行合并),所 以 Hudi 使用压缩机制来将数据文件和日志文件合并在一起并创建更新版本的数据文件。(文件合并时产生parquet)


MOW
merge on wr
ite写时合并。处理流程是:

  • 对于每一条 Key,查找它在 Base 数据中的位置(rowsetid + segmentid + 行号
  • 如果 Key  存在,则将该行数据标记删除。标记删除的信息记录在 Delete Bitmap中,其中每个 Segment 都有一个对应的 Delete Bitmap
  • 将更新的数据写入新的 Rowset 中,完成事务,让新数据可见(能够被查询到)
  • 查询时,读取 Delete Bitmap,将被标记删除的行过滤掉,只返回有效的数据


  • 查询流程:

当我们查询某⼀版本数据时, Doris 会从 LRU Cache Delete Bitmap 中查找该版本对应的缓存。

如果缓存不存在,再去 RowSet 中读取对应的 Bitmap。

使⽤ Delete Bitmap 对 RowSet 中的数据进⾏过滤,将结果返回。


引入了一个 LRU Cache,每个版本的 Bitmap 只需要做一次合并操作。

优缺点和应用场景

cow

  • 优点:读取时,只读取对应分区的一个数据文件即可,较为高效;
  • 缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。
  • 适用场景:对于一些读多写少的数据,写入时复制的做法就很不错,例如配置、黑名单、物流地址等变化非常少的数据,这是一种无锁的实现。可以帮我们实现程序更高的并发。

COW缺陷

  • 数据一致性问题
    cow这种实现只是保证数据的最终一致性,在添加到拷贝数据但还没进行替换的时候,读到的仍然是旧数据。
  • 内存占用问题
    如果对象比较大,频繁地进行替换会消耗内存,从而引发 Java 的 GC 问题,这个时候,我们应该考虑其他的容器,例如 ConcurrentHashMap

mor

  • 优点:由于写入数据先写delta log,且delta log较小,所以写入成本较低
  • 缺点:需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并
    Merge-on-Read 的特点是写⼊速度比较快,但是在数据读取过程中由于需要进⾏多路归并排序,存在着大量非必要的 CPU 计算资源消耗和 IO 开销。

mow
           优点:兼顾了写入和查询性能。该模式不需要在读取的时候通过归并排序来对主键进行去重,这对于高频写入的场景来说,大大减少了查询执行时的额外消耗。此外还能够支持谓词下推,并能够很好利用 Doris 丰富的索引,在数据 IO 层面就能够进行充分的数据裁剪,大大减少数据的读取量和计算量,因此在很多场景的查询中都有非常明显的性能提升。


 

总结

hudi/delta lake:cow/mor

kudu: delta store

doris:mor/mow

redis: cow

starrocks: full row upsert/delete /cow/mor/mow


Merge-On-Write 付出中等的写入代价,换取了较低的读取成本,对谓词下推、非 key 列索引过滤均能友好支持,并对查询性能优化有较好的效果。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
算法 Java
BTRFS - COW B-trees
介绍btrfs的COW特性。
68 1
|
6月前
|
存储 算法 数据处理
常用拷贝和替换算法-copy讲解
常用拷贝和替换算法-copy讲解
73 1
|
6月前
|
存储 缓存 网络协议
零拷贝(zero-copy)的一篇普通文章
零拷贝(zero-copy)的一篇普通文章
81 0
|
6月前
|
存储 安全 Java
简单聊聊copy on write(写时复制)技术
简单聊聊copy on write(写时复制)技术
都8102年了,还用fastq-dump,快换fasterq-dump吧
之前写过一篇文章Fastq-dump: 一个神奇的软件, 详细介绍了fastq-dump的用法。 虽然fastq-dump参数很多,而且一直被吐槽参数说明写的太差,但是如果真的要用起来其实也就是一行代码 fastq-dump --gzip --split-3 --defline-qual '+' --defline-seq '@$ac-$si/$ri' SRRXXXXX| SRRXXXX.sra # 加上--gzip后需要时间进行文件压缩 当然除了参数问题,还有一个让人诟病的地方就是他只能单个线程,所以速度特别的慢。
4957 0
都8102年了,还用fastq-dump,快换fasterq-dump吧
|
存储 Unix Java
Linux-Copy On Write写时复制机制初探
Linux-Copy On Write写时复制机制初探
155 0
|
存储 消息中间件 缓存
什么是零拷贝技术(Zero Copy)?
什么是零拷贝技术(Zero Copy)?
什么是零拷贝技术(Zero Copy)?
|
算法
算法题:cow
**题目: 奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文。 碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W 三种字符的字符串。 尽管贝茜无法解密该文字,但是她很欣赏 C,O,W 按顺序构成她最喜欢的单词 COW。
93 0
|
存储 缓存 NoSQL
有关 COW (CopyOnWrite) 的一切
写入时复制(英语:Copy-on-write,简称COW)是一种计算机 [程序设计]领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是 [透明]的。此做法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy) 被创建,因此多个调用者只是读取操作时可以共享同一份资源。
有关 COW (CopyOnWrite) 的一切