使用Apache Hudi在优步建立一个大规模的交易数据湖

0.
使用Apache Hudi在优步建立一个大规模的交易数据湖

从确保准确的eta到预测最佳交通路线,在优步平台上提供安全、无缝的运输和送货体验需要可靠、高性能的大规模数据存储和分析。2016年,优步开发了Apache Hudi,一种增量处理框架,以低延迟和高效率为业务关键数据管道提供动力。一年后,我们选择开源这个解决方案,让其他依赖数据的组织利用它的好处,然后,在2019年,我们把这个承诺又推进了一步捐给Apache软件基金会。现在,差不多一年半过去了,阿帕奇·胡迪已经升级为aApache软件基金会的顶级项目。在这一里程碑式的时刻,我们想与大家分享Apache Hudi的构建、发布、优化和毕业的过程,为更大的大数据社区造福。

Apache Hudi是什么?

Apache Hudi是一个存储抽象框架,可以帮助分布式组织构建和管理pb级的数据湖。使用upserts和增量拉取等原语,Hudi为批处理型大数据带来了流处理方式。这些特性有助于为我们的服务提供更快、更新鲜的数据,统一的服务层具有数分钟的数据延迟,避免了维护多个系统的任何额外开销。除了灵活性之外,Apache Hudi还可以在Hadoop分布式文件系统(HDFS)或云存储上操作。

Hudi在数据湖上支持原子性、一致性、隔离和持久性(ACID)语义。Hudi的两个最广泛使用的功能是upserts和incremental pull,这让用户能够吸收变化数据,并将它们大规模应用到数据湖。为了实现这一点,Hudi提供了广泛的可插入索引功能,以及它自己的数据索引实现。Hudi在数据湖中控制和管理文件布局的能力非常重要,不仅可以克服HDFS namenode和其他云存储的限制,还可以通过提高可靠性和查询性能来维护健康的数据生态系统。为此,Hudi支持多个查询引擎集成,如Presto、Apache Hive、Apache Spark和Apache Impala。

图1所示。Apache Hudi获取更改日志、事件和增量流,通过在表上公开不同的视图来服务于不同的用例。

在较高的层次上,Hudi概念上分为3个主要组件需要存储的原始数据、用于提供upsert功能的数据索引,以及用于管理数据集的元数据。在其核心部分,Hudi维护了在不同时间点在桌面上执行的所有操作的时间轴,在Hudi中称为瞬间。这提供了表格的即时视图,同时还有效地支持按到达顺序检索数据。Hudi保证在时间轴上执行的操作是原子的且基于即时时间的一致性,换句话说,即在数据库中进行更改的时间。通过这些信息,Hudi提供了相同Hudi表的不同视图,包括用于快速列性能的读优化视图、用于快速数据摄取的实时视图和作为更改日志流读取Hudi表的增量视图,如上面图1所示。

哈迪将数据表组织到分布式文件系统上的基础路径下的目录结构中。表被分解为分区,并且在每个分区中,文件被组织到文件组中,由文件ID唯一标识。每个文件组都包含多个文件切片,其中每个切片包含在某个提交/压缩即时时间的基本文件(* .parquet)以及包含插入/更新的日志文件(* .log.log。*)。生成基本文件以来的基本文件。Hudi采用多数并发控制(MVCC),其中Conction Action合并日志和基本文件以生成新的文件切片和清洁操作,摆脱未使用/较旧的文件切片以回收文件系统上的空间。

Hudi支持两种表类型:写时复制和读时合并。写时复制表类型专门使用列文件格式存储数据(例如,Apache Parquet)。通过写时复制,通过在写过程中执行同步合并,简单地更新版本和重写文件。

合并读表类型使用列(如Apache parquet)和基于行(如Apache Avro)文件格式的组合存储数据。更新被记录到增量文件中,然后进行压缩,以同步或异步地生成新版本的柱状文件。

Hudi还支持两种查询类型:快照和增量查询。快照查询是在给定提交或压缩操作时获取表的“快照”的请求。在利用快照查询时,写时复制表类型仅公开最新文件片中的基/columnar文件,并保证与非hudi columnar表相同的columnar查询性能。写时复制提供了对现有拼花表的插入式替换,同时提供了upsert/delete和其他功能。在合并读表的情况下,快照查询通过实时合并最新文件片的基本文件和增量文件来公开接近实时的数据(以分钟为单位)。对于写时复制表,增量查询提供在给定提交或压缩后写入表的新数据,提供更改流以启用增量数据管道。

在优步使用Apache Hudi

在Uber,我们利用哈迪为各种用例提供​​快速,准确的关于超级平台上的旅行的数据检测欺诈到推荐餐厅和食物在我们的UberEats平台上。为了演示Hudi是如何工作的,让我们来看看我们如何确保优步市场中的出行数据是最新的数据湖,改善了优步平台上乘客和司机的用户体验。旅行的典型生命周期从骑行者请求旅行时开始,随着旅行的进行继续,并在旅行结束和骑行者到达最终目的地时结束。优步的核心出行数据以表格的形式存储无模式,优步可扩展的数据存储。TRIPS表中的单程条目可以在旅行的生命周期内体验许多更新。在Hudi在Uber实现之前,大型Apache Spark作业会定期重新刻到Apache HDFS以吸收上游在线表插入,更新和删除,反映了跳闸状态的变化。对于上下文,2016年初(在我们建立了哈迪之前),我们的一些最大的工作是使用超过1000名求职者和20 TB的数据处理。这个过程不仅效率低下,而且越来越庞大。各种团队跨越公司依赖于快速,准确的数据分析,提供高质量的用户体验,并满足这些要求,显然我们的目前的解决方案不会衡量我们的数据湖泊的增量处理。使用快照和重新加载解决方案将数据移动到HDFS,这些低效率泄漏到所有管道,包括消耗此原始数据的下游ETL。我们可以看到这些问题只加剧了越来越大的规模。

由于没有其他可行的开源解决方案可使用,我们建造并推出了哈迪2016年底,优步将建立一个交易数据湖,以促进快速、可靠的大规模数据更新。优步的第一代Hudi完全利用了写时复制表类型,将作业处理速度提高到每30分钟20GB,将I/O和写放大能力降低了100倍。到2017年底,优步的所有原始数据表都采用了Hudi格式,运行着地球上最大的交易数据湖之一。

图2。Hudi的写时复制特性使我们能够执行文件级更新,极大地提高了数据的新鲜度。

改进Apache Hudi为优步和其他

随着Uber对数据处理和存储需求的增长,我们开始触及Hudi写时复制功能的局限性,主要是需要继续提高数据的呈现速度和新鲜度。即使使用Hudi的写时复制功能,我们的一些表也收到了分布在90%文件中的更新,导致数据湖中任何给定的大型表的数据重写大约为100 TB。因为重写时复制会重写整个文件,即使是一个修改过的记录,所以写时复制功能会导致更高的写放大率和降低新鲜度,从而导致HDFS集群上不必要的I/O,并更快地降低磁盘的性能。此外,更多的数据表更新意味着更多的文件版本和HDFS文件数的激增。反过来,这些需求会导致HDFS namenode不稳定和更高的计算成本。

为了解决这些日益增长的问题,我们实现了第二个表类型merge-on-read。因为读取合并通过动态合并数据来利用接近实时的数据,所以我们谨慎地使用该特性以避免查询端计算成本。我们merge-on-read部署模型包括三个独立的工作,包括摄入的工作带来新的数据组成的插入、更新和删除,一个小小的压实工作,异步和积极契约更新/删除最近在少量的分区,和一个主要的压实工作缓慢而稳步契约更新/删除大量的旧的分区。这些作业以不同的频率运行,次要作业和吸收作业比主要作业运行得更频繁,以确保最新分区中的数据以柱状格式快速可用。有了这样的部署模型,我们就能够以柱状格式为数千个查询提供新鲜数据,并将查询端合并成本绑定到最近的分区上。使用合并读取,我们能够解决上述三个问题,Hudi表几乎不受任何数量的更新或删除我们的数据湖。现在,在Uber,我们根据用例利用Apache Hudi的写时复制和读时合并功能。

图3.优步的Apache Hudi团队为合并读取表开发了一个数据压缩策略,以便经常以柱状格式转换最近的分区,从而限制查询侧计算成本。

感谢Hudi,优步摄取每天超过5000亿个记录,进入我们150多个PB数据湖,跨越10,000张桌子和数千个数据流水线,每天使用超过30,000个虚拟核心。哈迪桌在我们的各种服务中每周提供超过100万张查询。

反思Apache Hudi

优步在2017年开放了Hudi,为其他公司提供了大规模吸收和管理数据存储的解决方案,为大数据带来了流处理。随着Hudi进入Apache软件基金会的一个顶级项目,Uber的大数据团队反思了激励我们首先建立Hudi的各种考虑,包括:

    • 我们如何才能更有效地存储和处理数据?
    • 我们如何确保我们的数据湖包含高质量的表?
    • 随着我们的运营增长,我们如何继续以尺度有效地提供低延迟的数据?
    • 在几分钟的延迟是可以接受的情况下,我们如何统一服务层?

如果没有良好的标准化和原语,数据湖可能很快变成不可用的“数据沼泽”。这种混乱局面不仅需要大量的时间和资源来协调、清理和修复表,而且还迫使各个服务所有者构建复杂的算法来调优、洗刷和交易,给你的技术堆栈带来不必要的复杂性。

如上所述,HUDI通过帮助用户通过在分布式文件系统上的大型分析数据集的无缝的摄取和管理来控制其数据湖泊来解决这些间隙。构建数据湖是一种多方面的问题,需要投资数据标准化,存储技术,文件管理实践,选择摄取数据与查询数据之间的正确性能权衡,以及更多。随着我们建造哈迪的大数据社区与其他成员交谈,我们了解到许多工程组织的这些问题都猖獗。我们希望在过去的几年内开放采购和与Apache社区建立在哈迪身上,使他人更加了解他们自己的大数据运作,以改善行业的改进应用。在优步外部,Apache Hudi用于生产几家公司,包括阿里巴巴云(Alibaba Cloud)、Udemy和腾讯(Tencent)就是其中几家。

前方的道路

图4。Apache Hudi用例包括数据分析和基础设施运行状况监视。

Hudi通过对数据集实施schemalization,帮助用户构建更健壮、更新鲜的数据湖,提供高质量的洞察。

在Uber,拥有世界上最大的交易数据湖之一,让我们有机会识别独特的Apache Hudi用例。既然在这种规模上解决问题和创造效率会产生重大影响,我们就有直接的动机去深入研究。在Uber,我们已经使用了高级的Hudi原语,比如增量拉动帮助构建链式增量管道,减少作业的计算空间,否则作业将执行大型扫描和写操作。我们调优压实基于特定用例和需求的合并读表策略。最近几个月,我们向Apache基金会捐赠了Hudi,优步贡献了一些功能,比如嵌入式时间轴服务,用于有效的文件系统访问删除重命名以支持云友好部署提高增量拉取性能举几个例子。

在接下来的几个月里,Uber打算为Apache Hudi社区贡献许多新功能。其中一些特性通过优化计算使用和提高数据应用程序的性能来帮助降低成本。我们还将深入研究如何基于访问模式和数据应用程序需求改进存储管理和查询性能。

有关我们计划如何实现这些目标的更多信息,您可以阅读一些RFC(包括,智能元数据,支持列索引和O(1)查询规划有效地引导表到Hudi令人生议的录音索引)哈迪队在优步队提出更广泛的Apache社区。

随着Apache Hudi逐渐成为Apache的顶级项目,我们很高兴能为项目雄心勃勃的路线图做出贡献。Hudi使优步和其他公司能够在未来通过开源文件格式来证明他们的数据湖的速度、可靠性和交易能力,抽象出许多大数据的挑战,并构建丰富和便携的数据应用程序。

Apache Hudi是一个壮大的社区,具有令人兴奋,不断发展的发展路线图。如果您有兴趣为此项目提供贡献,请连接在这里

评论

没有帖子展示