概念2:COW与MOR
名词解释
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
面:数据湖