Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Hudi:Apache Hadoop上的增量处理框架

Hudi:Apache Hadoop上的增量处理框架

作者头像
从大数据到人工智能
发布于 2022-01-18 23:57:49
发布于 2022-01-18 23:57:49
1.3K0
举报
文章被收录于专栏:大数据-BigData大数据-BigData

温馨提示 本文部分翻译自2017.3.12 Uber Engineering发布文章《Hudi: Uber Engineering’s Incremental Processing Framework on Apache Hadoop》,随着Hudi的发展其架构发生了变化,但是对于了解Hudi的起源和演变还是非常有帮助的!

随着ApacheParquet和Apache ORC等存储格式以及Presto和Apache Impala等查询引擎的发展,Hadoop生态系统有潜力作为面向分钟级延时场景的通用统一服务层。然而,为了实现这一点,这需要在HDFS中实现高效且低延迟的数据摄取及数据准备。

为了解决这个问题,优步开发了Hudi项目,这是一个增量处理框架,高效和低延迟地为所有业务关键数据链路提供有力支持。

基本概述

Hudi是一种针对分析型业务的、扫描优化的数据存储抽象,它能够使HDFS数据集在分钟级的时延内支持变更,也支持下游系统对这个数据集的增量处理。

Hudi数据集通过自定义的InputFormat兼容当前Hadoop生态系统,包括Apache Hive,Apache Parquet,Presto和Apache Spark,使得终端用户可以无缝的对接。

数据流模型通过时延和数据完整性保证两个维度去权衡以构建数据管道。下图所示的是Uber Engineering如何根据这两个维度进行处理方式的划分。

对于很少一些需要真正做到约1分钟的延时的用例及简单业务指标的展示应用,我们基于行级的流式处理。对于传统的机器学习和实验有效性分析用例,我们选择更加擅长较重计算的批处理。对于包含复杂连接或者重要数据处理的近实时场景,我们基于Hudi以及它的增量处理原语来获得两全其美的结果。

架构设计

存储

Hudi将数据集组织到一个basepath下的分区目录结构中,类似于传统的Hive表。数据集被分成多个分区,这些分区是包含该分区数据文件的目录。每个分区都由相对于基本路径的partitionpath唯一标识。在每个分区中,记录分布到多个数据文件中。每个数据文件都由唯一的fileId和生成该文件的commit来标识。在更新的情况下,多个数据文件可以共享在不同commit时写入的相同fileId。

每条记录都由记录键唯一标识,并映射到fileId。一旦记录的第一个版本被写入到文件中,记录键和fileId之间的映射是永久的。简而言之,fileId标识一组文件,其中包含一组记录的所有版本。

Hudi存储由三个不同的部分组成:

  1. 元数据:Hudi将数据集上执行的所有活动的元数据作为时间轴维护,这支持数据集的瞬时视图。它存储在基路径的元数据目录下。下面我们概述了时间轴中的行动类型:
  2. 提交:单个提交捕获关于将一批记录原子写入数据集的信息。提交由一个单调递增的时间戳标识,这表示写操作的开始。
  3. 清除:清除数据集中不再在运行查询中使用的旧版本文件的后台活动。
  4. 压缩:协调Hudi内不同数据结构的后台活动(例如,将更新从基于行的日志文件移动到柱状格式)。
  5. Index: Hudi维护一个索引来快速将传入的记录键映射到fileId,如果记录键已经存在。索引实现是可插拔的,以下是当前可用的选项:
  6. 存储在每个数据文件页脚中的Bloom过滤器:首选的默认选项,因为它不依赖于任何外部系统。数据和索引总是彼此一致的。
  7. Apache HBase:对一小批keys的高效查找。这个选项可能会在索引标记期间节省几秒钟的时间。
  8. 数据:Hudi以两种不同的存储格式存储所有输入的数据。实际使用的格式是可插拔的,但基本上需要以下特征:
  9. 扫描优化的柱状存储格式(ROFormat)。默认为Apache Parquet。
  • 写优化的基于行的存储格式(WOFormat)。默认是Apache Avro。

图5:Hudi存储内部。上面的Hudi Storage图描述了一个YYYYMMDDHHMISS格式的提交时间,可以简化为HH:SS。

优化

Hudi存储针对HDFS的使用模式进行了优化。压缩是将数据从写优化格式转换为扫描优化格式的关键操作。由于压缩的基本并行单元是重写单个fileId,所以Hudi确保所有数据文件都以HDFS块大小文件的形式写出来,以平衡压缩并行性、查询扫描并行性和HDFS中的文件总数。压缩也是可插拔的,可以对其进行扩展,以弥补较旧的、更新频率较低的数据文件,从而进一步减少文件总数。

摄取路径

Hudi是一个Spark库,目的是作为流摄取作业运行,并以小批量(通常是一到两分钟的顺序)摄取数据。然而,根据延迟需求和资源协商时间,摄取作业也可以使用Apache Oozie或Apache airflow作为计划任务运行。

下面是带有默认配置的Hudi摄入的写路径:

  • Hudi从所涉及的分区(意思是,从输入批处理分散开来的分区)中的所有parquet文件加载Bloom过滤器索引,并通过将传入的键映射到现有文件以进行更新,将记录标记为更新或插入。这里的联接可能在输入批处理大小、分区分布或分区中的文件数量上发生倾斜。它是通过在join键上执行范围分区和子分区来自动处理的,以避免Spark中对远程shuffle块的2GB限制。
  • Hudi组每个分区插入,分配一个新的fileId,并附加到相应的日志文件,直到日志文件达到HDFS块大小。一旦达到块大小,Hudi将创建另一个fileId,并对该分区中的所有插入重复此过程。
    • 调度程序每隔几分钟就会启动一个有时间限制的压缩过程,它会生成一个优先级排序的压缩列表,并使用当前的parquet文件压缩fileId的所有avro文件,以创建该parquet文件的下一个版本。
    • 压缩是异步运行的,锁定被压缩的特定日志版本,并将对该fileId的新更新写入新的日志版本。在Zookeeper中获取锁。
    • 压缩是根据被压缩的日志数据的大小进行优先级排序的,并且可以通过压缩策略插入。在每次压缩迭代中,日志量最大的文件首先压缩,而小的日志文件最后压缩,因为重写parquet文件的成本不会分摊到文件更新的次数上。
  • 如果有一个文件存在,Hudi会将fileId的更新追加到它相应的日志文件中;如果没有,则会创建一个日志文件。
  • 如果摄取作业成功,则在Hudi元时间轴中记录一次提交,这将自动地将inflight文件重命名为提交文件,并写出关于分区和创建的fileId版本的详细信息。

相关优化

如前所述,Hudi努力使文件大小与底层块大小对齐。根据柱状压缩的效率和要压缩的分区中的数据量,压缩仍然可以创建小的parquet文件。这最终会在下一次的摄取迭代中自动修正,因为对分区的插入被打包为对现有小文件的更新。最终,文件大小将增长到压缩后的底层块大小。

失败恢复

当由于间歇性错误导致摄取任务失败时,Spark会重新计算RDD并进行自动解析。如果失败的数量超过Spark中的maxRetries,则摄取作业失败,下一次迭代将再次重试摄取相同的批。以下是两个重要的区别:

  • 导入失败会在日志文件中写入部分avro块。
    • 这是通过在提交元数据中存储关于块和日志文件版本的开始偏移量的元数据来处理的。在读取日志时,跳过不相关的、有时是部分写入的提交块,并在avro文件上适当地设置了seek位置。
  • 压缩失败可能会写入部分拼parquet文件。
    • 这是由查询层处理的,它根据提交元数据过滤文件版本。查询层只会为最后完成的压缩挑选文件。下一个压缩迭代将回滚失败的压缩并再次尝试。

查询路径

commit meta timeline使能够在hdfs上的相同数据同时做读优化视图和实时视图;这些视图允许客户端在数据延迟时间和查询执行时间之间进行选择。Hudi为这些视图提供了一个自定义的InputFormat,并包括一个Hive注册模块,该模块将这两个视图注册为Hive metastore表。这两种输入格式都理解fileId和提交时间,并过滤文件,只选择最近提交的文件。然后,Hudi对这些数据文件进行分割,以运行查询计划。InputFormat的详细内容如下:

  • HoodieReadOptimizedInputFormat:提供一个扫描优化的视图,它过滤掉所有日志文件,只选择压缩的parquet文件的最新版本。
  • HoodieRealtimeInputFormat:提供一个更实时的视图,除了选择压缩的parquet文件的最新版本外,还提供了一个RecordReader,以便在扫描期间将日志文件与相应的parquet文件合并。

这两个InputFormats都扩展了MapredParquetInputFormat和VectorizedParquetRecordReader,因此读取parquet文件所做的所有优化仍然适用。Presto和SparkSQL在Hive metastore表上可以开箱即用,只要所需的hoodie-hadoop-mr库在classpath中。

增量处理

如前所述,建模的表需要在HDFS中处理和服务,以便HDFS成为统一的服务层。构建低延迟模型表需要链化HDFS数据集的增量处理能力。由于Hudi维护关于提交时间和为每个提交创建的文件版本的元数据,增量变更集可以在开始时间戳和结束时间戳内从特定于Hudi的数据集中提取。

这过程以同样的方式作为一个正常查询,除了特定的文件版本,查询时间范围内而不是最新版本,和一个额外的谓词的提交时间推到文件扫描检索只在请求的持续时间改变的记录。可以获得更改集的持续时间是由可以保留多少个未清理的数据文件版本决定的。

这使得带有水印的流到流连接和流到数据集连接能够在HDFS中计算和插入建模的表。

关于当前版本的Hudi

本文中描述的大多数技术都是指Hudi的当前一代(称为“读时合并”),该技术仍在积极开发中。在接下来的几个月里,Hudi将取代上一代(称为“写时复制”)存储系统。上一代通过消除日志文件和降低延迟来简化体系结构。几个月来,这一直在为优步的数据获取和表格建模提供动力。

随着Hudi继续推动延迟的边界,以更快地在HDFS中吸收,在我们向外扩展时,不可避免地会有一些识别瓶颈的迭代。我们打算研究的一些潜在瓶颈与嵌入式全局不可变索引加速索引和设计自定义可索引日志存储格式有关,以优化磁盘寻址合并。因此,我们欢迎您的反馈,并鼓励您为我们的项目做出贡献。

本文为从大数据人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://cloud.tencent.com/developer/article/1936493

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Apache Hudi | 统一批和近实时分析的增量处理框架
随着Apache Parquet和Apache ORC等存储格式以及Presto和Apache Impala等查询引擎的发展,Hadoop生态系统有潜力作为面向分钟级延时场景的通用统一服务层。然而,为了实现这一点,这需要在HDFS中实现高效且低延迟的数据摄取及数据准备。
王知无-import_bigdata
2020/02/10
3K0
基于Hadoop的统一数据服务层演进与Hudi技术的前世今生
随着Apache Parquet和Apache ORC等存储格式以及Presto和Apache Impala等查询引擎的发展,Hadoop生态系统有潜力成为容忍几分钟延迟的通用统一服务层。然而,这需要Hadoop分布式文件系统(HDFS)实现高效低延迟的数据摄入和准备。
用户9421738
2025/03/28
480
基于Hadoop的统一数据服务层演进与Hudi技术的前世今生
Apache Hudi和Presto的前世今生
一篇由Apache Hudi PMC Bhavani Sudha Saktheeswaran和AWS Presto团队工程师Brandon Scheller分享Apache Hudi和Presto集成的一篇文章。
ApacheHudi
2021/04/13
1.7K0
基于AIGC写作尝试:深入理解 Apache Hudi
本文的目的是为读者提供全面了解Apache Hudi的知识。具体而言,读者可以了解到Apache Hudi是什么、它的架构如何工作、常见的使用案例以及与之配合工作的最佳实践。此外,读者还将获得有关如何设置和配置Apache Hudi,以及优化其性能的技巧的见解。通过阅读本文,读者应该对Apache Hudi有扎实的理解,并了解如何在其数据处理流程中利用它的优势。
jhonye
2023/04/18
1.8K0
「Hudi系列」Hudi查询&写入&常见问题汇总
2. 「Hudi系列」Apache Hudi入门指南 | SparkSQL+Hive+Presto集成
王知无-import_bigdata
2022/06/05
6.8K0
「Hudi系列」Hudi查询&写入&常见问题汇总
Apache Hudi 架构原理与最佳实践
Apache Hudi代表Hadoop Upserts anD Incrementals,管理大型分析数据集在HDFS上的存储。Hudi的主要目的是高效减少摄取过程中的数据延迟。由Uber开发并开源,HDFS上的分析数据集通过两种类型的表提供服务:读优化表(Read Optimized Table)和近实时表(Near-Real-Time Table)。
大数据技术架构
2020/03/25
5.5K0
Uber基于Apache Hudi构建PB级数据湖实践
从确保准确预计到达时间到预测最佳交通路线,在Uber平台上提供安全、无缝的运输和交付体验需要可靠、高性能的大规模数据存储和分析。2016年,Uber开发了增量处理框架Apache Hudi,以低延迟和高效率为关键业务数据管道赋能。一年后,我们开源了该解决方案,以使得其他有需要的组织也可以利用Hudi的优势。接着在2019年,我们履行承诺,进一步将其捐赠给了Apache Software Foundation,差不多一年半之后,Apache Hudi毕业成为Apache Software Foundation顶级项目。为纪念这一里程碑,我们想分享Apache Hudi的构建、发布、优化和毕业之旅,以使更大的大数据社区受益。
ApacheHudi
2021/04/13
1K0
「Apache Hudi系列」核心概念与架构设计总结
Apache Hudi依赖 HDFS 做底层的存储,所以可以支撑非常大规模的数据存储。同时基于下面两个原语,Hudi可以解决流批一体的存储问题。
王知无-import_bigdata
2022/03/11
1.3K0
「Apache Hudi系列」核心概念与架构设计总结
Hudi 基础知识详解
Apache Hudi将核心仓库和数据库功能直接带到数据湖中。Hudi提供了表、事务、高效upserts/删除、高级索引、流式摄取服务、数据群集/压缩优化以及并发,同时保持数据以开源文件格式保留。
zeekling
2023/10/06
6.2K0
ApacheHudi常见问题汇总
如果你希望将数据快速提取到HDFS或云存储中,Hudi可以提供帮助。另外,如果你的ETL /hive/spark作业很慢或占用大量资源,那么Hudi可以通过提供一种增量式读取和写入数据的方法来提供帮助。
ApacheHudi
2021/04/13
1.8K0
数据湖 | Apache Hudi 设计与架构最强解读
Apache Hudi(简称:Hudi)允许您在现有的hadoop兼容存储之上存储大量数据,同时提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理。
王知无-import_bigdata
2020/11/06
3.7K0
数据湖 | Apache Hudi 设计与架构最强解读
从hudi持久化文件理解其核心概念
这是hudi系列的第一篇文章,先从核心概念,存储的文件格式加深对概念的理解,后续再逐步对使用(spark/flink入hudi,hudi同步hive等)、原理(压缩机制,索引,聚族等)展开分享~
陈猿解码
2023/02/28
9960
从hudi持久化文件理解其核心概念
Apache Hudi:统一批和近实时分析的存储和服务
一篇由三位Hudi PMC在2018年做的关于Hudi的分享,介绍了Hudi产生的背景及设计,现在看来也很有意义。
大数据技术架构
2020/03/25
1.6K0
腾讯广告业务基于Apache Flink + Hudi的批流一体实践
广告主和代理商通过广告投放平台来进行广告投放,由多个媒介进行广告展示 ,从而触达到潜在用户。整个过程中会产生各种各样的数据,比如展现数据、点击数据。其中非常重要的数据是计费数据,以计费日志为依据向上可统计如行业维度、客户维度的消耗数据,分析不同维度的计费数据有助于业务及时进行商业决策,但目前部门内消耗统计以离线为主,这种T+1延迟的结果已经无法满足商业分析同学的日常分析需求,所以我们的目标为:建设口径统一的实时消耗数据,结合BI工具的自动化配置和展现能力,满足业务实时多维消耗分析,提高数据运营的效率和数据准确性。
大数据真好玩
2022/06/17
1.4K0
腾讯广告业务基于Apache Flink + Hudi的批流一体实践
使用Apache Hudi构建大规模、事务性数据湖
一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk
大数据技术架构
2020/07/02
2.2K0
一文彻底理解Apache Hudi的清理服务
Hudi 提供不同的表管理服务来管理数据湖上表的数据,其中一项服务称为Cleaner(清理服务)。随着用户向表中写入更多数据,对于每次更新,Hudi会生成一个新版本的数据文件用于保存更新后的记录(COPY_ON_WRITE) 或将这些增量更新写入日志文件以避免重写更新版本的数据文件 (MERGE_ON_READ)。在这种情况下,根据更新频率,文件版本数可能会无限增长,但如果不需要保留无限的历史记录,则必须有一个流程(服务)来回收旧版本的数据,这就是 Hudi 的清理服务。
ApacheHudi
2021/07/05
1.1K0
一文彻底理解Apache Hudi的清理服务
Hudi基本概念
在本节中,我们将讨论重要的概念和术语,这些概念和术语有助于理解并有效使用这些原语。
ApacheHudi
2021/04/13
2.2K0
基于Apache Hudi + MinIO 构建流式数据湖
Apache Hudi 是一个流式数据湖平台,将核心仓库和数据库功能直接引入数据湖。Hudi 不满足于将自己称为 Delta 或 Apache Iceberg 之类的开放文件格式,它提供表、事务、更新/删除、高级索引、流式摄取服务、数据聚簇/压缩优化和并发性。Hudi 于 2016 年推出,牢牢扎根于 Hadoop 生态系统,解释了名称背后的含义:Hadoop Upserts Deletes and Incrementals。它是为管理 HDFS 上大型分析数据集的存储而开发的。Hudi 的主要目的是减少流数据摄取过程中的延迟。
从大数据到人工智能
2022/10/28
1.6K0
基于Apache Hudi + MinIO 构建流式数据湖
Lakehouse 特性对比 | Apache Hudi vs Delta Lake vs Apache Iceberg
随着 Lakehouse 的日益普及,人们对分析和比较作为该数据架构核心的开源项目的兴趣日益浓厚:Apache Hudi、Delta Lake 和 Apache Iceberg。
大数据技术架构
2022/12/01
1.9K0
Lakehouse 特性对比 | Apache Hudi vs Delta Lake vs Apache Iceberg
速度!Apache Hudi又双叕被国内顶级云服务提供商集成了!
Apache Hudi 在 HDFS 的数据集上提供了插入更新和增量拉取的流原语。
ApacheHudi
2021/04/13
8550
推荐阅读
相关推荐
Apache Hudi | 统一批和近实时分析的增量处理框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档