数据湖 | Apache Hudi 设计与架构最强解读

Hudi是一个开源框架,旨在简化大规模数据湖的流式处理和批处理,提供更新/删除记录和变更流功能。它通过键值数据模型、自管理机制和日志结构化存储,优化了数据的读写效率,支持快照查询、增量查询和读优化查询,实现了数据的近实时处理和高效存储。

目录

1. 简介

2. 设计原则

2.1 流式读/写

2.2 自管理

2.3 万物皆日志:

2.4 键-值数据模型

3. 表设计

3.1 时间轴

3.2 数据文件

3.3 索引

4. 表类型

4.1 写时复制(CopyOnWrite)表

4.2 读时合并(MergeOnRead)表

5. 写设计

5.1 写

5.2 压缩

5.3 清理

5.4 DFS访问优化

6. 查询

6.1 快照查询

6.2 增量查询

6.3 读优化查询


本文将介绍Apache Hudi的基本概念、设计以及总体基础架构。

1. 简介

Apache Hudi(简称:Hudi)允许您在现有的hadoop兼容存储之上存储大量数据,同时提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理。

这两种原语分别是:

1)Update/Delete记录:Hudi使用细粒度的文件/记录级别索引来支持Update/Delete记录,同时还提供写操作的事务保证。查询会处理最后一个提交的快照,并基于此输出结果。

2)变更流:Hudi对获取数据变更提供了一流的支持:可以从给定的时间点获取给定表中已updated/inserted/deleted的所有记录的增量流,并解锁新的查询姿势(类别)。

这些原语紧密结合,解锁了基于DFS抽象的流/增量处理能力。如果您熟悉流处理,那么这和从kafka主题消费事件,然后使用状态存储逐步累加中间结果类似。

在架构上会有以下几点优势:

1)效率的提升:摄取数据通常需要处理更新、删除以及强制唯一键约束。然而,由于缺乏像Hudi这样能对这些功能提供标准支持的系统,数据工程师们通常会采用大批量的作业来重新处理一整天的事件,或者每次运行都重新加载整个上游数据库,从而导致大量的计算资源浪费。由于Hudi支持记录级更新,它通过只处理有变更的记录并且只重写表中已更新/删除的部分,而不是重写整个表分区甚至整个表,为这些操作带来一个数量级的性能提升。

2)更快的ETL/派生Pipelines:从外部系统摄入数据后,下一步需要使用Apache Spark/Apache Hive或者任何其他数据处理框架来ETL这些数据用于诸如数据仓库、机器学习或者仅仅是数据分析等一些应用场景。通常,这些处理再次依赖以代码或SQL表示的批处理作业,这些作业将批量处理所有输入数据并重新计算所有输出结果。通过使用增量查询而不是快照查询来查询一个或多个输入表,可以大大加速此类数据管道,从而再次导致像上面一样仅处理来自上游表的增量更改,然后upsert或者delete目标派生表。

3)获取新鲜数据:减少资源还能获取性能上的提升并不是常见的事。毕竟我们通常会使用更多的资源(例如内存)来提升性能(例如查询延迟)。通过从根本上摆脱数据集的传统管理方式,Hudi将批量处理增量化的一个很好的副作用是:与以前的数据湖相比,pipeline运行的时间会更短,数据交付会更快。

4)统一存储:基于以上三个优点,在现有数据湖之上进行更快速、更轻量的处理意味着仅出于访问近实时数据的目的时不再需要专门的存储或数据集市。

2. 设计原则

2.1 流式读/写

Hudi是从零设计的,用于从大型数据集输入和输出数据,并借鉴了数据库设计的原理。为此,Hudi提供了索引实现,可以将记录的键快速映射到其所在的文件位置。同样,对于流式输出数据,Hudi通过其特殊列添加并跟踪记录级别的元数据,从而可以提供所有发生变更的精确增量流。

2.2 自管理

Hudi注意到用户可能对数据新鲜度(写友好)与查询性能(读/查询友好)有不同的期望,并支持了三种查询类型,这些类型提供实时快照,增量流以及稍早的纯列数据。在每一步,Hudi都努力做到自我管理(例如自动优化编写程序的并行性,保持文件大小)和自我修复(例如:自动回滚失败的提交),即使这样做会稍微增加运行时成本(例如:在内存中缓存输入数据已分析工作负载)。如果没有这些内置的操作杠杆/自我管理功能,这些大型流水线的运营成本通常会翻倍。

2.3 万物皆日志:

Hudi还具有 append only、云数据友好的设计,该设计使Hudi无缝管理所有云提供商伤的数据,并实现了日志结构化存储系统的原理。

2.4 键-值数据模型

在写方面,Hudi表被建模为键值对数据集,其中每条记录都有一个唯一的记录键。此外,一个记录键还可以包括分区路径,在该路径下,可以对记录进行分区和存储。这通常有助于减少索引查询的搜索空间。

3. 表设计

了解了Hudi项目的关键技术动机后,现在让我们更深入地研究Hudi系统本身的设计。在较高的层次上,用于写Hudi表的组件使用了一种受支持的方式嵌入到Apache Spark作业中,它会在支持DFS的存储上生成代表Hudi表的一组文件。然后,在具有一定保证的情况下,诸如Apache Spark、Presto、Apache Hive之类的查询引擎可以查询该表。

Hudi表的三个主要组件:

1)有序的时间轴元数据。类似于数据库事务日志。

2)分层布局的数据文件:实际写入表中的数据。

3)索引(多种实现方式):映射包含指定记录的数据集。

Hudi提供了以下功能来对基础数据进行写入、查询,这使其成为大型数据湖的重要模块:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值