zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

概念:COW与MOR

2023-04-18 14:21:05 时间

名词解释

COW:写时复制
MOR:读时合并

CopyOnWrite 思想

写时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种通用优化策略。其核心思想是,如果有多个调用者(Callers)同时访问相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者修改资源内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此做法主要的优点是如果调用者没有修改资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。

通俗易懂的讲,写时复制技术就是不同进程在访问同一资源的时候,只有更新操作,才会去复制一份新的数据并更新替换,否则都是访问同一个资源。

JDK 的 CopyOnWriteArrayList/CopyOnWriteArraySet 容器正是采用了 COW 思想

COW适用场景

对于一些读多写少的数据,写入时复制的做法就很不错,例如配置、黑名单、物流地址等变化非常少的数据,这是一种无锁的实现。可以帮我们实现程序更高的并发。

COW缺陷

  • 数据一致性问题
    cow这种实现只是保证数据的最终一致性,在添加到拷贝数据但还没进行替换的时候,读到的仍然是旧数据。

  • 内存占用问题
    如果对象比较大,频繁地进行替换会消耗内存,从而引发 Java 的 GC 问题,这个时候,我们应该考虑其他的容器,例如 ConcurrentHashMap

MergeOnRead的思想

读取时合并的思想:新插入的数据存储在delta log 中。定期再将delta log合并进行parquet数据文件。读取数据时,会将delta log跟老的数据文件做merge,得到完整的数据返回。当然,MOR表也可以像COW表一样,忽略delta log,只读取最近的完整数据文件。

对于hudi中的Merge-On-Read Table,整体的结构有点像 LSM-Tree

适用场景

由于写入数据先写delta log,且delta log较小,所以写入成本较低。

MOR缺陷

需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并。

基于上述基础概念,Hudi提供了两类表格式COW表和MOR表,他们会在数据的写入和查询性能上有一些不同。

点:cow、mor概念科普
线:Hudi
面:数据湖