COW(Copy-On-Write)
和 MRO(Merge-On-Read)
是 Hudi 中两种不同类型的表,它们的主要区别在于读写操作的性能以及内存占用。
1. COW(Copy-On-Write)
COW 表是在写入操作时进行复制的表,每次写入操作都会创建一个新的 COW 表,并将原表覆盖。COW 表的主要优点是可以减少内存占用和提高写入性能。由于每次写入操作都会创建一个新的COW
表,因此COW
表适用于频繁进行写入操作的场景,例如批量更新、数据批量插入等。COW
表的缺点是需要额外的内存管理能力,需要进行内存管理和回收。
1.1 COW 表的原理
COW 表是一种数据复制技术,其主要思想是在内存中创建一个新的副本,并将原对象和副本进行关联。当用户对副本进行修改时,原对象会被更新以反映副本的修改。当用户释放对象时,内存中的对象会被销毁,而内存空间可以被重新使用。
在 Hudi 中,COW 表是在写入操作时创建一个新的 COW 表,并将原表覆盖。新的 COW 表会保存在内存中,而原表会被释放。当用户读取数据时,Hudi 会查找原表是否还在内存中,如果在,则直接读取原表;如果不在,则需要读取新的 COW 表,并将其与原表进行关联。在COW表中,只有数据文件/基本文件(.parquet
),没有增量日志文件(.log.*
)。对每一个新批次写入都将创建相应数据文件的新版本(新的FileSlice
),新版本文件包括旧版本文件的记录以及来自传入批次的记录(全量最新)。
1.2 COW 表的优缺点
COW 表具有以下优点:
- 减少内存占用:每次写操作都会创建一个新的
COW
表,而不是直接修改原来的表,因此可以减少内存占用,提高系统的性能。 - 提高可扩展性:
COW
表可以动态创建和销毁,可以根据实际需要动态调整表的大小,从而提高系统的可扩展性。 - 适合频繁写操作:
COW
表适用于对表进行频繁的写操作,因为每次写操作都会创建一个新的COW
表,可以避免内存溢出和竞争问题,从而提高系统的性能和可扩展性。
COW 表也具有以下缺点:
- 降低读取性能:
COW
表是在写入操作时创建的,因此在读取数据时,需要先查找新的COW
表,然后再与原表进行关联,会降低读取性能。 - 需要内存管理:
COW
表需要在内存中管理原表和COW
表之间的关系,因此需要额外的内存管理能力,需要进行内存管理和回收。
1.3 在 Hudi 中的应用
Hudi 表是一种基于内存的数据存储系统,用于快速读取和写入大量数据。COW
表在Hudi
表中得到了广泛的应用,尤其是在需要频繁进行写操作的场景中。
例如,在需要对大量数据进行批量更新的场景下,可以使用 Hudi
中的 COW
表来减少内存占用和提高效率。在批量更新时,Hudi
会创建一个新的 COW
表,并将原表覆盖。新的 COW
表可以用来存储更新后的数据,而原表可以被释放,从而减少内存占用和提高性能。
此外,COW
表还可以用于 Hudi
中的索引结构。由于索引通常是读取频率较高的数据,因此使用COW
表可以减少索引的内存占用,提高索引的性能和可扩展性。在 Hudi
中,可以使用 COW
表来创建动态索引,以适应不断变化的数据需求。
总的来说,COW
表是 Hudi
中一种非常有用的数据复制技术,可以用于减少内存占用、提高性能和可扩展性等方面。在实际应用中,可以根据具体场景选择合适的 COW
表类型,以实现更好的性能和可扩展性。
2. COW(Copy-On-Write)
MRO
表是在读取操作时进行合并的表,每次读取操作都会将新的数据合并到已有的表中,而不是直接替换已有的数据。MRO
表的主要优点是可以提高读取性能和可扩展性。由于每次读取操作都会将新的数据合并到已有的表中,因此 MRO
表适用于频繁进行读取操作的场景,例如数据查询、数据批量读取等。MRO
表的缺点是需要额外的内存管理能力,需要进行内存管理和回收。
2.1 原理
MRO(Merge-On-Read)
是一种数据合并技术,它在读取数据时进行数据合并。具体来说,当读取某个表时,Hudi 会先读取多个版本的数据,然后对这些版本进行合并,得出最新的数据。在数据合并的过程中,Hudi
会根据数据版本的时间戳、数据模型和操作方式等因素,采取不同的合并策略。例如,对于一些数据冲突,Hudi
可以使用And/Or
策略进行解决,对于一些数据缺失,Hudi 可以使用求和策略进行填充。MOR
表中,包含列存的基本文件(.parquet)
和行存的增量日志文件(基于行的avro
格式,.log.*
)。顾名思义,MOR
表的合并成本在读取端。因此在写入期间我们不会合并或创建较新的数据文件版本。标记/索引完成后,对于具有要更新记录的现有数据文件,Hudi
创建增量日志文件并适当命名它们,以便它们都属于一个文件组。
2.2 优缺点
MRO
具有以下优点:
-
提高数据处理的效率和鲁棒性。
MRO
可以在读取数据时进行数据合并,从而减少数据的读取次数,提高数据处理的效率。此外,MRO
还可以避免数据丢失和冲突无法解决等问题。 -
适用于大规模数据处理场景。
MRO
适用于大规模数据处理场景,因为它可以减少数据的读取次数和存储量,从而提高数据处理的效率和鲁棒性。 -
提高数据的可靠性和完整性。
MRO
可以在读取数据时进行数据合并,从而避免数据丢失和冲突无法解决等问题,从而提高数据的可靠性和完整性。
MRO
也具有以下缺点:
-
实现复杂度较高。
MRO
需要在读取数据时进行数据合并,因此需要考虑到多个因素,如数据模型、操作方式、时间戳、内部版本等,从而实现复杂的数据合并算法,从而导致实现复杂度较高。 -
冲突处理策略不同导致性能差异大。
MRO
中不同的冲突处理策略会导致性能差异很大,因此需要根据具体的场景和数据特点选择合适的冲突处理策略。
2.3 应用
MRO
可以应用于多种场景,例如:
-
大规模数据处理。
MRO
可以用于大规模数据处理场景,例如数据仓库、商业智能等场景,从而提高数据处理的效率和鲁棒性。 -
数据备份和恢复。
MRO
可以用于数据备份和恢复场景,例如数据库灾备等
在 Hudi
中,可以根据具体应用场景选择合适的表类型。对于频繁进行写入操作的场景,可以选择COW
表;对于频繁进行读取操作的场景,可以选择MRO
表。同时,Hudi
还提供了动态表结构功能,可以根据实际需要动态调整表的大小和类型,以实现更好的性能和可扩展性。