hudi写时复制与读时合并
COPY_ON_WRITE
是 Apache Hudi 中的一种表存储模式,指的是 写入数据时复制(写时复制) 的策略。具体来说,它描述了在更新、插入或删除数据时的存储方式和行为。
详细解释:
Hudi 目前提供两种主要的存储类型:COPY_ON_WRITE
和 MERGE_ON_READ
。其中,COPY_ON_WRITE
是一种 写时复制 的策略,而 MERGE_ON_READ
则是 读时合并 的策略。每种策略都有不同的性能特点和适用场景。
COPY_ON_WRITE
模式的工作原理:
-
写时复制(Copy on Write):每当数据发生更新时,Hudi 会为更新的数据创建一个新的文件版本,而不是直接修改原有的数据文件。旧的数据文件会保留下来,直到进行垃圾回收操作时才会被清理。这种方式确保了数据的一致性和完整性,因为它避免了在更新时直接覆盖数据,减少了出现脏数据的风险。
-
更新过程:在
COPY_ON_WRITE
模式下,当数据更新时,Hudi 会:- 读取到要更新的数据。
- 生成一个新的数据文件,并将更新的数据写入新文件中。
- 通过元数据管理确保数据的一致性和查询的正确性。
-
文件存储:每次写入更新时,会生成新的 Parquet 文件,而不是修改原始的 Parquet 文件。这样做的好处是,能够提供更加可靠的数据版本控制,并且查询时会访问到更新后的数据。
COPY_ON_WRITE
与 MERGE_ON_READ
的比较:
-
COPY_ON_WRITE
:- 优点:更新时创建新的文件,能够保证数据一致性,适合于读操作较频繁、写操作较少的场景。
- 缺点:每次更新都要创建新文件,可能会产生更多的小文件,因此需要定期进行文件合并(Compaction)来优化性能。
-
MERGE_ON_READ
:- 优点:数据更新时不创建新的文件,而是对现有的文件进行修改和合并,适合于写操作频繁的场景。
- 缺点:读取数据时需要合并多个文件(包括更新后的和旧的文件),查询性能可能会受影响。
COPY_ON_WRITE
适用场景:
- 查询为主的工作负载:如果系统中主要是读操作较多,而写操作相对较少,可以选择
COPY_ON_WRITE
,因为这种模式可以在查询时提供较好的性能。 - 数据一致性要求高的场景:由于每次更新都会生成新的数据文件,这种方式有助于减少在数据写入过程中可能出现的脏数据问题,适合对数据一致性要求高的应用。
总结:
COPY_ON_WRITE
是一种更新数据时创建新文件的策略,适用于查询为主、写入较少的场景。- 该模式通过为每次更新的数据创建新的文件来保证数据一致性和完整性,但会带来一定的存储开销(生成更多的文件),因此需要定期进行文件合并(Compaction)。
如果你的应用场景更多依赖于读取性能,并且更新较少,COPY_ON_WRITE
是一个合适的选择。