Hudi|技术干货 | Uber基于Apache Hudi构建PB级数据湖实践


北京联盟_本文原题:技术干货 | Uber基于Apache Hudi构建PB级数据湖实践
Hudi|技术干货 | Uber基于Apache Hudi构建PB级数据湖实践
本文插图
文 | hudi 来源 | ApacheHudi

1. 引言
从确保准确预计到达时间到预测最佳交通路线 , 在Uber平台上提供安全、无缝的运输和交付体验需要可靠、高性能的大规模数据存储和分析 。 2016年 , Uber开发了增量处理框架Apache Hudi , 以低延迟和高效率为关键业务数据管道赋能 。 一年后 , Uber开源了该解决方案 , 以使得其他有需要的组织也可以利用Hudi的优势 。 接着在2019年 , Uber履行承诺 , 进一步将其捐赠给了Apache Software Foundation , 差不多一年半之后 , Apache Hudi毕业成为Apache Software Foundation顶级项目 。 为纪念这一里程碑 , Uber特别分享了Apache Hudi的构建、发布、优化和毕业之旅 , 以使更大的大数据社区受益 。
2. 什么是Apache Hudi
Apache Hudi是一个存储抽象框架 , 可帮助组织构建和管理PB级数据湖 , 通过使用upsert和增量拉取等原语 , Hudi将流式处理带到了类似批处理的大数据中 。 这些功能通过统一的服务层(几分钟左右即可实现数据延迟) , 帮助Uber更快 , 更新鲜地获取服务数据 , 从而避免了维护多个系统的额外开销 。 更灵活地 , Apache Hudi还可以在Hadoop分布式文件系统(HDFS)或云存储上运行 。
Hudi在数据湖上启用原子性、一致性、隔离性和持久性(ACID)语义 。 Hudi的两个最广泛使用的功能是upserts和增量拉取 , 它使用户能够捕获变更数据并将其应用于数据湖 , 为了实现这一点 , Hudi提供了可插拔索引机制 , 以及自定义索引实现 。 Hudi具有控制和管理数据湖中文件布局的能力 , 这不仅能克服HDFS NameNode节点和其他云存储限制 , 而且对于通过提高可靠性和查询性能来维护健康的数据生态系统也非常重要 。 另外Hudi支持多种查询引擎 , 例如Presto , Apache Hive , Apache Spark和Apache Impala 。
Hudi|技术干货 | Uber基于Apache Hudi构建PB级数据湖实践
本文插图
图1. Apache Hudi通过在表上提供不同的视图来摄取变更日志、事件和增量流 , 以服务于不同的应用场景

从总体上讲 , Hudi在概念上分为3个主要组成部分:需要存储的原始数据;用于提供upsert功能的索引数据以及用于管理数据集的元数据 。 内核方面 , Hudi维护在不同时间点在表上执行的所有动作的时间轴 , 在Hudi中称为即时 , 这提供了表格的即时视图 , 同时还有效地支持了按序到达的数据检索 , Hudi保证时间轴上的操作是原子性的 , 并且基于即时时间 , 与数据库中进行更改的时间是一致的 。 利用这些信息 , Hudi提供了同一Hudi表的不同视图 , 包括用于快速列式文件性能的读优化视图 , 用于快速数据摄取的实时视图以及用于将Hudi表作为变更日志流读取的增量视图 , 如上图1所示 。
Hudi将数据表组织到分布式文件系统上基本路径(basepath)下的目录结构中 。 表分为多个分区 , 在每个分区内 , 文件被组织成文件组 , 由文件ID唯一标识 。 每个文件组包含几个文件切片 , 其中每个切片包含在某个特定提交/压缩(commit/compaction)瞬间生成的基本数据文件(*.parquet) , 以及包含对基本数据文件进行插入/更新的一组日志文件(*.log) 。 Hudi采用了Multiversion Concurrency Control(MVCC) , 其中压缩操作将日志和基本文件合并以生成新的文件片 , 而清理操作则将未使用的/较旧的文件片去除 , 以回收文件系统上的空间 。
Hudi支持两种表类型:写时复制和读时合并 。 写时复制表类型仅使用列文件格式(例如 , Apache Parquet)存储数据 。 通过写时复制 , 可以通过在写过程中执行同步合并来简单地更新版本并重写文件 。


推荐阅读