性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析

news2024/11/18 9:27:00

Apache Hudi 是一款开源的数据湖解决方案,它能够帮助企业更好地管理和分析海量数据,支持高效的数据更新和查询。并提供多种数据压缩和存储格式以及索引功能,从而为企业数据仓库实践提供更加灵活和高效的数据处理方式。

在金融领域,企业可以使用 Hudi 来处理大量需要实时查询和更新的金融交易数据。在电商业务中,企业可以使用 Hudi 来跟踪订单数据,以及对订单进行实时更新和查询。在物流和供应链管理中,Hudi 可以帮助企业实时处理和更新大量的物流数据,保证数据的一致性和可靠性。

作为一站式大数据基础软件的袋鼠云数栈,基于 Apache Hudi 为客户提供了存量数据迁移、数据入湖、文件治理等完整支持能力。在这个过程中,积累了一些 Hudi 性能优化的经验,希望通过本文与大家分享交流。

Hudi 原理简析

Apache Hudi 是一个开源的数据湖解决方案,它是基于 Hadoop 和 Spark 的技术栈构建而成,并且拓展到了 Flink、 Trino 等多种计算引擎。Apache Hudi 的主要目的是提供一个高效、可扩展且可靠的数据湖解决方案,用于管理和处理大规模的数据集。

Hudi 的核心实现是通过将数据集合划分为多个数据文件,并为每个数据文件维护一个数据版本和索引信息,来支持增量数据更新和查询操作。如下图所示,当用户需要对数据进行更新时,Hudi 会将更新的数据写入一个新的数据文件中,并通过写时复制(copy-on-write)操作,将原始数据文件中的数据记录复制到新的数据文件中,并在新的数据文件中更新对应的数据记录。

同时,Hudi 会更新数据版本和索引信息,以便用户可以根据数据版本和唯一标识符来访问最新的数据记录。当用户需要查询数据时,Hudi 会使用索引信息来定位数据记录,并返回最新的数据记录。

file

在 Hudi 的 merge on read 模式中,更新操作是通过在查询时将原始数据和更新数据进行合并来实现的。具体来说,当有新的数据要被写入时,Hudi 会将新数据追加写入到一个新的日志文件中,并在元数据文件中记录新文件的信息。当查询数据时,Hudi 会将所有数据文件进行合并,生成一个视图,然后对视图进行查询。

由于 Hudi 只需要在查询时将需要更新的数据进行合并,而不需要在写入时进行合并,因此可以避免写入时的性能开销,从而实现快速的更新操作。

Apache Hudi 在写入数据时创建一个新版本,而读取数据时通过将所有版本的数据进行合并来生成一个视图。在视图中,每个数据记录只出现一次,并且是最新的版本,这样可以保证读操作只会涉及到视图中的数据,而不会对原始数据进行修改,从而实现了读写分离。

通过多版本实现并发控制,Hudi 可以在保证数据一致性的前提下,提高读操作的性能,同时也保证了数据的可靠性和可扩展性。

Hudi 优化实践

下面介绍基于袋鼠云数栈的实践经验,所做的 Hudi 性能优化。

支持多索引

Hudi 将数据集合划分为多个数据文件,并为每个数据文件维护一个数据版本和索引信息,来支持增量数据更新和查询操作。通过构建索引就可以利用生成的元数据快速定位查询所需数据的位置,如下图所示。这样可以减少甚至避免从文件系统中扫描或者读取不必要的数据,减少 IO 的开销,大大提升查询效率。Hudi 已经支持几种不同的索引技术,并且还在不断地改进和添加更多的索引实现。

袋鼠云数栈支持用户在创建 Hudi 表时就设置想要使用的索引类型,包括 SIMPLE、BLOOM FILTER、BUCKET 等类型。在写入过程中,Hudi 会将索引信息写入到 parquet 文件或者外部存储中,在读取时应用程序根据这些信息进行比较判断,跳过不必要的数据文件。

file

Hudi 在0.11.0版本引入了 MetadataTable 这种多模式索引,利用 MetadataTable 汇总元数据信息,应用程序可以避免文件系统调用文件 Listing 操作(这在对象存储中是非常耗时的),还可以避免直接读取 parquet 文件中的 footer 信息,能够大幅提升查询性能。

袋鼠云数栈支持用户在建表时就开启多模式索引,在写入数据的同时将文件的索引信息也写入 MetadataTable。数栈还支持以异步的方式构建 MetadataTable,保证写入仍然处于低延迟的状态,再由后台的应用程序离线生成 MetadataTable 以提升读取性能。

由于 MetadataTable 依赖 base 文件记录的 column stats/bloomfilter 等信息,因此 merge on read 模式下没有办法将 log 文件的信息保存到 MetadataTable 中,开源框架上没有利用它实现进行文件过滤。

但考虑到 base 文件和 log 文件共用相同的 fileId,袋鼠云技术团队在数栈内部进行了改造:通过 MetadataTable 获取到 base 文件之后,再根据 fileId 进行 log 文件过滤,避免不必要读取。经过验证,这种改动能够使得 merge on read 模式具备和 copy on write 模式相同的过滤效果。

优化文件布局

在大数据存储中,文件布局优化是一种重要的性能优化技术。其主要目的是在数据写入时将数据按照一定的规则布局到存储介质中,以提高数据读取和处理的效率。文件布局优化可以采用多种方式,如时间戳排序、分区排序和合并文件等方式。

Hudi 提供了一种名为 Clustering 的文件布局优化方法,可以借此将小文件合并成较大的文件以减少查询引擎需要扫描的文件总数,或者利用空间填充曲线之类的概念来适应数据湖布局并减少查询读取的数据量。利用 Clustering,可以将具有相同查询特征的数据放到相邻的几个文件内,在查询时再根据索引信息进行过滤,能够有效减少需要读取的文件数量,降低计算成本。

袋鼠云数栈提供了可视化页面以方便用户对文件布局进行调整,用户可以根据需要自由设置排序策略、排序字段、过滤条件等,如下图所示,应用程序会周期性地在后台根据配置对文件进行优化。因为 Hudi 采用多版本组织文件,用户不需要担心优化任务会影响正在运行的读取任务,在优化完成后新的读取任务即可享受到新的布局带来的效率提升。

file

探索新特性

在落地 Hudi 的过程中,袋鼠云数栈也在积极跟踪实践社区的新功能新特性。

在 Hudi 0.13.0 中,Hudi 实现了“优化记录负载处理”的特性。通过设置 hoodie.datasource.write.record.merger.impls=org.apache.hudi.HoodieSparkRecordMerger 和 hoodie.logfile.data.block.format=parquet 两个参数避免了额外的复制和反序列化,在写入操作的整个生命周期内以统一的方式处理记录。

袋鼠云数栈测试和引入了这项特性,经过验证,更新性能相比上一版本有了约20%的提升,符合社区的描述。另外,数栈还参考了 Hudi 0.13.0 引入的 disruptor 无锁消息队列写入数据的新特性,通过设置 hoodie.write.executor.type = DISRUPTOR 和 hoodie.write.executor.disruptor.wait.strategy = BUSY_SPIN_WAIT 参数,结合前述的优化配置,更新性能整体提升了30%以上。

总结

Apache Hudi 的优势在于支持增量数据处理,具有良好的数据一致性和可靠性,同时提供多种性能优化技术,能够提高数据处理和查询的效率,具有良好的性能和可扩展性。

袋鼠云数栈团队在落地 Hudi 的过程中,验证了 Hudi 的多种索引,应用了文件组织优化功能,总结了常用的调优参数,为推动企业数据湖建设,提供可靠、高效、可扩展的数据湖解决方案积累了不少经验,能够帮助企业更好地管理和分析数据,提高业务决策的精度和效率。

《数栈产品白皮书》:https://www.dtstack.com/resources/1004?src=szsm

《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szcsdn

同时,欢迎对大数据开源项目有兴趣的同学加入我们,一起交流最新开源技术信息,号码:30537511,项目地址:https://github.com/DTStack

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql高阶语句(一)

Mysql高阶语句(一) 一、MySQL高级进阶SQL 语句1、SELECT斜体样式2、DISTINCT3、WHERE4、AND、OR5、IN6、BETWEEN7、通配符、LIKE8、ORDER BY9、| | 连接符10、GROUP BY11、HAVING 二、函数1、数学函数2、聚合函数3、字符串函数4、日期时间函数 一、MySQL…

短视频矩阵源码

短视频矩阵源码的开发部署其实并不难,主要依托于抖音平台各种开放权限进行研发,市面上常见的源码功能构建也是大同小异,主要处理还在于细节及产品优化上。 如: 1. 视频制作板块,文字转语音功能,当然各种云&…

【人工智能技术专题】「入门到精通系列教程」零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP、GPT-Pre-Training和数据标注都是什么)

零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP、GPT-Pre-Training和数据标注都是什么) 前言专栏介绍专栏说明学习大纲前提条件面向读者学习目标核心内容NLP自然话言理解指的是什么定义概念涉及到的领域技术与应用关系 重要性语言结构剖析分…

AI已在职场大规模应用,求职者被要求熟练使用ChatGPT

“能熟练使用ChatGPT、Midjourney等AI软件生产高质量文图内容完成辅助工作。”当这条岗位要求悄然出现在今夏的应聘季,时光仿佛被拉回到数十年前,那个要求“会使用Word、Excel等计算机软件”的求职年代。 彼时,因为计算机的逐渐普及&#xf…

Linux服务器Jenkins部署打包Android

程序猿日常 记Jenkins部署打包Android介绍 Jenkins 自动打包 Android 应用,后面介绍打包Flutter应用,然后介绍打包Android原生Flutter混合应用 准备工作 1.jenkins服务器地址 账户密码 2.项目git地址 访问账号密码 3.ssh 链接服务器账户密码 安装An…

【Java高级语法】(十)面向对象:掀开Java 的面向对象盖章时代,一起来发现OOP的有趣编程秘密!~

Java高级语法详解之面向对象 1️⃣ 类和对象2️⃣ 三大特性2.1 封装(Encapsulation)2.2 继承(Inheritance)2.3 多态(Polymorphism) 3️⃣ 面向对象编程(OOP)和面向过程编程(PP)4️⃣ 方法重载和方法重写🔍 小结&#x…

MySQL高级SQL语句操作一

MySQL高级SQL语句操作 一、准备环境二、常用操作三、通配符与like1、通配符2、like 四、ORDER BY五、函数1、数学函数2、聚合函数3、字符串函数 六、GROUP BY七、HAVING八、别名(字段別名 、表格別名)九、子查询(连接表格) 一、准…

记录--前端实现文件预览(pdf、excel、word、图片)

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前端实现文件预览功能 需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建…

管理类联考——英语——趣味篇——不择手段——a开头单词

本书分为两个部分。第一部分是核心词汇的讲解,借助谐音、联想、编故事、词根词缀、举例、图画等手段,为每个单词找到它存在的语境,基本上可以让你做到过目不忘。在这一部分中,单词被划分为20个单元,同学们可以每天搞定…

Vue全家桶(五):Vue3快速上手

目录 1.Vue3简介2.Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 3. 创建Vue3.0工程3.1 使用 vue-cli 创建3.2 使用 vite 创建3.3 Vue3的初始化工程 4. Composition API介绍4.1 Composition API 的优势4.1.1 Options API 存在的问题4.1.2 Composi…

基于STM32 ARM+FPGA的电能质量分析仪方案(一)硬件设计

本章主要给出了本系统的设计目标和硬件设计方案,后面详细介绍了硬件电路的设计 过程,包括数据采集板、 FPGAARM 控制板。 3.1系统设计目标 本系统的主要目的是实现电能质量指标的高精度测量和数据分析,其具体技术指标如 下所示&#xff1…

C++指针对象和异常(12)

异常(exception) 为什么有异常 异常在C用于错误处理,C语言中一般使用返回值表示错误,C对错误处理进行了扩展,统一使用异常机制来处理程序中发生的错误。 C的异常处理包括两个部分 ----- 抛出异常和捕获异常,如果抛出的异常被捕…

​LeetCode解法汇总LCP 41. 黑白翻转棋

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 在 n*m 大小的棋盘中,有黑白两种棋子,黑棋记作字母 &quo…

想去除List重复元素?我有两种方法搞定,赶紧拿去用

关注“Java架构栈”微信公众号,回复暗号【Java面试题】即可获取大厂面试题 问题背景 最近就有很多小伙伴在后台私信波哥,问波哥这样一个问题:“波哥,我最近正在找工作,被面试官问到List该怎么去重?我感觉自…

命令执行测试-业务安全测试实操(12)

命令执行测试 测试原理和方法 在应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的承数。如PHP中的svstem、exec、shell exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。测试中如果没有对参数(如…

Lowe‘s EDI 项目数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统,我们根据以往的项目实施经验,将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后,只需要下载我们整理好的示例代码,并放置在知行之桥指定的工作区中,即可开始使用。 …

Flutter如何使用mvi? bloc结合自定义http库的实现

文章目录 前言一、先看看如何使用bloc吧1. 定义页面需要的数据2. 定义通用加载状态3. 定义事件4. 定义bloc5. 定义UI6. 使用 二、lib_http1. request定义2. response定义3. 适配器接口4. 构建adapter需要的数据5. 网络异常统一封装6. 核心请求类7. 提供网络访问配置8. dio适配器…

编译原理笔记13:自上而下语法分析(3)构造预测分析表、LL(1) 文法

目录 构造预测分析表不懂也能用的构造步骤FIRST、FOLLOW 和分析表的原理? LL(1) 文法 构造预测分析表 预测分析表的作用,是为推导的进行指明方向——我们用当前下推栈栈顶和读写头所指向的符号的组合(即当前的状态),去…

网络安全学习指南:新手入门建议

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言网络安全基础知识学…