【Hudi】Copy-on-Write(COW)和Merge-on-Read(MOR)

2024-02-08 04:36
文章标签 cow merge read write hudi copy mor

本文主要是介绍【Hudi】Copy-on-Write(COW)和Merge-on-Read(MOR),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://cloud.tencent.com/developer/article/1827930

https://www.sev7e0.site/%E7%94%B1hudi%E4%BA%86%E8%A7%A3-copy-on-write-cow-%E5%92%8C-merge-on-read-mor

数据湖—hudi核心概念

COW

“写入时复制”表中的文件切片仅包含基本/列文件,每次提交都会生成新版本的基本文件。换句话说,我们在每次提交时都隐式压缩,这样只存在列数据。因此,写入放大率(为1字节的输入数据写入的字节数)高得多,其中读取放大率为零。这是分析工作负载非常需要的属性,因为分析工作负载主要是重读取的。

下面从概念上说明了当数据写入到写时拷贝表中并在其上运行两个查询时,这是如何工作的。
在这里插入图片描述

当数据被写入时,对现有文件组的更新会为该文件组生成一个新的切片,该切片标记有提交instant time,而插入会分配一个新文件组并为该文件群写入其第一个切片。这些文件切片及其提交时间在上面用颜色编码。针对这样一个表运行的SQL查询(例如:select count(*)统计该分区中的总记录),首先检查最新提交的时间线,并过滤每个文件组中除最新文件片段之外的所有文件片段。正如您所看到的,一个旧的查询不会看到当前飞行中提交的文件以粉色编码,而是在提交后开始的一个新的查询会拾取新的数据。因此,查询不受任何写入失败/部分写入的影响,仅在提交的数据上运行。

COW表的目的,是通过一下几个方面功能上提高表的组织能力:

  • 文件级自动更新数据,而不是重写整个表/分区
  • 能够增量更改,而不是浪费扫描或试探摸索
  • 严格控制文件大小以保持出色的查询性能(小文件会严重影响查询性能)。

Merge on Read(MOR)

读时合并表是写时复制的超集,从某种意义上说,通过只在最新的文件切片中显示基/列文件来支持表的读优化查询。此外,它将每个文件组的传入的 upserts 存储到基于行的增量日志中,以便通过在查询期间将增量日志应用到每个文件id的最新版本来支持快照查询。因此,这种表类型试图智能地平衡读和写放大,以提供接近实时的数据。这里最重要的变化将是压缩程序,它现在仔细选择需要将哪些增量日志文件压缩到其列状基础文件上,以保持查询性能的检查(较大的增量日志文件将导致较长的合并时间,而合并数据位于查询端)

在这里插入图片描述
我们现在每1分钟左右就会提交一次,这是其他表类型无法做到的。

在每个文件id组中,现在有一个增量日志文件,它保存对基本列文件中记录的传入更新。在示例中,增量日志文件保存10:05到10:10之间的所有数据。与之前一样,基本列式文件仍然使用提交进行版本控制。因此,如果只查看基本文件,那么表布局看起来就像一个写时复制表。

定期压缩过程从增量日志中协调这些更改,并生成新版本的基础文件,就像示例中10:05发生的情况一样。

查询同一基础表有两种方法:读取优化查询和快照查询,这取决于我们选择的是查询性能还是数据的新鲜度。

当来自提交的数据可用于查询时,对于读优化查询,语义会以微妙的方式发生变化。注意,这样一个在10:10运行的查询在10:05之后不会看到数据,而快照查询总是看到最新的数据。

当我们触发压缩时,它决定压缩什么,这是解决这些难题的关键。通过实施压缩策略(与旧分区相比,我们积极压缩最新分区),我们可以确保读取优化的查询在X分钟内以一致的方式查看发布的数据。

合并读表的目的是直接在DFS上实现近乎实时的处理,而不是将数据复制到可能无法处理数据量的专用系统。该表还有一些次要的好处,例如通过避免数据的同步合并来减少写入放大,即一批中每1字节数据写入的数据量

对比

Table Types
Hudi支持以下表类型。
Copy on write:使用列式文件格式(例如 parquet)存储数据。通过在写入期间执行同步合并,更新简单地对文件进行版本和重写。
Merge on read:使用列式(例如 parquet)+基于行的(例如avro)文件格式的组合存储数据。更新被记录到增量文件中,然后被压缩以同步或异步地生成新版本的列式文件。
在这里插入图片描述

Hudi COW 两个用户同时写一张表会出现的问题

https://blog.csdn.net/hjl18309163914/article/details/113522379?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-113522379-blog-129016744.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-113522379-blog-129016744.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=9

在这里插入图片描述

这篇关于【Hudi】Copy-on-Write(COW)和Merge-on-Read(MOR)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689912

相关文章

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

[轻笔记] pip install : Read timed out. (closed)

添加超时参数(单位秒) pip --default-timeout=10000 install ${package_name}

Cannot read property ‘length‘ of null while opening vscode terminal

同一问题地址:Cannot read property ‘length’ of null while opening vscode terminal 问题描述 One day, 我在ubuntu 18.04下用vscode打开一个项目,并想和往常一样在vscode使用终端,发现报错Cannot read property 'length' of null。 解决 打开setting.jso

70-java write类应用场景

在Java中,我们可以使用java.io包中的FileWriter和BufferedWriter类来写入数据到文件。以下是一个简单的例子,展示了如何使用FileWriter和BufferedWriter来写入数据到文件: import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;pub

SylixOS write 0 字节问题

1 问题描述 在移植中间件过程中,在SylixOS调用write函数写入0字节的数据到文件中时,会导致对应的中间件测试用例失败,失败的原因是文件系统中的write函数在Linux系统和SylixOS有区别,两种实现的差别如下。 2 write函数的实现机制 2.1 SylixOS实现机制 在SylixOS下通过write 函数写数据到普通文件中时,第一步会判断写入的数据是否为0,如果是0直