HUDI基础

什么是Hudi?

image.png

HUDI(Hadoop Upserts Deletes and Incrementals)是一个开源的数据湖工具,用于管理大规模数据湖中的数据。

HUDI旨在解决数据湖中常见的一些挑战,如数据的增量更新、删除和查询等。它提供了一套API和工具,可以帮助用户在数据湖中进行写入、更新、删除和查询等操作,并提供了高效的数据索引和存储机制,以加速数据的访问和处理。

HUDI的核心理念是将数据分为小的、可修改的单元,称为"写时复制(copy-on-write)"。当数据需要更新或删除时,HUDI会创建一个新的数据文件,而不是直接修改原始数据文件。这种设计可以保证数据的不可变性,同时提供了高效的增量更新和删除操作。

HUDI还提供了用于数据管理的元数据存储和查询功能,可以跟踪数据的版本、变更历史和元数据信息。这使得用户可以轻松地追踪和管理数据的变更,同时支持time-travel查询,即可以查询数据在不同时间点的版本。

Hudi Timeline

Hudi timeline是HUDI用于跟踪和管理数据变更历史的一种机制。它记录了数据湖中各个数据集的不同版本和变更操作,以及它们在时间上的顺序。

Timeline的核心概念是HUDI数据集的不可变性。每当对HUDI数据集进行写入、更新或删除操作时,HUDI会创建一个新的数据文件或目录,而不是直接修改原始数据文件。每个数据文件或目录都被分配一个唯一的时间戳,用于表示它的创建时间。

Timeline维护了所有数据文件和目录的时间戳信息,并按照时间顺序组织它们。这使得HUDI能够追踪数据集的完整变更历史,并支持time-travel query。通过Timeline,用户可以查询数据集在不同时间点的版本,回溯到过去的数据状态。

HUDI Timeline还提供了一些其他功能,如支持增量数据拉取(incremental data pull)和增量数据合并(incremental data merge)。增量数据拉取允许用户只拉取数据集中发生变化的部分,而不必处理整个数据集。增量数据合并则可以将多个HUDI数据集合并为一个数据集,并保持数据的一致性和有序性。

Hudi的Timeline由一系列按时间顺序的Instants组成,Instant有下面三部分:

  • Instant action: 对于Hudi table的操作类型;
  • Instant time:操作发生时间戳(比如20190117010349);
  • Instant state: Instant的当前状态。

Instant Action主要有以下几种:

  • COMMITS:commit表示将一批记录原子的写入到hudi table中;
  • CLEANS:删除表中不再需要的旧版本文件,后台活动。
  • DELTA_COMMIT:delta_commit指的是将一批记录原子写入 MergeOnRead 类型的表中,其中一些/所有数据可以只写入delta logs。
  • COMPACTION: 将delta logs里的数据与parquet data files合并。
  • ROLLBACK:表示commit/delta commit不成功并回滚,删除在此类写入期间产生的任何partial data files。
  • SAVEPOINT:将某些file group标记为“saved”,这样cleaner就不会删除它们。 在发生灾难/数据恢复情况时,它有助于将表恢复到timeline上的某个点。

Instant State主要有以下几种:

  • REQUESTED:表示已经被scheduled,但尚未启动的操作。
  • INFLIGHT:表示操作正在进行。
  • COMPLETED:表示操作已经完成。

Hudi Table/Query Type

在Hudi中,有几种常见的表类型,用于满足不同的数据管理和处理需求。下面是Hudi中常见的表类型:

  • Copy-on-Write (COW)表:COW表是Hudi最基本的表类型。它采用了写时复制的策略,每次更新操作都会创建一个新版本的完整数据集。新版本以一组新的文件形式存储,而原始数据保持不变。COW表适合那些数据写入一次后多次读取的场景。
  • Merge-on-Read (MOR)表:MOR表是Hudi引入的一种改进型表类型。它采用了基于读取时合并的策略。数据被组织成基础文件(base files)和日志文件(log files)。基础文件包含不可变的数据,而日志文件则记录了基础文件的增量更改。在查询执行期间,Hudi会动态地合并基础文件和日志文件,以提供一致的数据视图。MOR表适合那些需要频繁更新和低延迟查询的场景。


    image.png

在Hudi中,有几种常见的查询类型可以用来检索和分析数据。下面是Hudi中常用的查询类型:

  • Snapshot Query:Snapshot查询是一种基于数据快照(Snapshot)的查询方式。它可以获取Hudi表中的某个commit或compaction的数据快照,并以只读方式进行查询和分析。通过指定特定的时间戳或快照ID,可以获取表在该时间点的一致视图。
  • Incremental Query:Hudi支持增量查询,即只查询某个commit或compaction以来有变化的数据。增量查询利用Hudi表的增量存储和索引结构,可以快速检索到最新的变化数据,避免全表扫描,提高查询效率。
  • Read Optimized Queries:查询给定某个commit或compaction的snapshot。仅暴露file group中的base/columnar文件,不暴漏delta log文件,以期获得与非Hudi 列存表相同的查询性能。


    image.png

Hudi File Layout

  • Hudi将数据表组织成分布式文件系统上base path下的目录结构。
  • 表被分割成多个partition。
  • 在每个partition内,文件被组织成file group,由file ID唯一标识。
  • 每个file group包含多个file slices。
  • 每个file slice包含在某个commit/compaction instant生成的base file(.parquet),以及一组delta log(.log.*),这些delta log文件包含了自base file生成以来对base file的插入/更新操作。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、背景 传统数仓分为离线和实时两个部分 离线部分属于业务驱动,固定的计算逻辑,通过定时调度,最后产出报表; 实时...
    TOTower阅读 1,414评论 0 1
  • Hudi架构 一. 时间轴(TimeLine) 1.1 时间轴(TimeLine)概念 Hudi的核心是维护在不同...
    只是甲阅读 559评论 0 0
  • Flink 使用介绍相关文档目录 Flink 使用介绍相关文档目录[//www.greatytc.com...
    AlienPaul阅读 13,131评论 4 10
  • [TOC] 数据实时处理和实时的数据 实时分为处理的实时和数据的实时即席分析是要求对数据实时的处理,马上要得到对应...
    西北偏北阅读 1,184评论 0 0
  • 背景 本篇为Hudi概念和特性相关介绍。依据于官网和相关博客资料,融入了个人理解。内容可能会有疏漏,欢迎大家指正和...
    AlienPaul阅读 13,407评论 0 10