HashData的湖仓一体思考:Iceberg、Hudi特性讲解与支持方案
liuian 2025-05-16 14:46 72 浏览
湖仓一体作为一种新兴的开放式数据管理架构,能够充分发挥数据湖的灵活性、生态丰富以及数据仓库的企业级数据分析能力,已经成为企业建设现代数据平台的热门选择。
在此前的直播中,我们分享了HashData湖仓一体方案架构设计与Hive数据同步。本次直播,我们介绍了Iceberg、Hudi的特性与支持方案,并对HashData连接组件的原理和实现流程进行了详细的讲解和演示。以下内容根据直播文字整理。
Hudi与Iceberg技术应用场景
在企业数据平台建设过程中,随着数据量的持续增加与场景的丰富,每家企业都会基于自有技术路线和需求,发展出形态各异的架构设计。
数据湖作为一种不断演进、可扩展的大数据存储、处理和分析基础设施,允许企业存储任意规模的结构化和非结构化数据。伴随着云存储(尤其是对象存储)技术逐步成熟,数据湖的解决方案也逐步向云原生靠近,数据处理方式由批处理向流式处理发展。
在这样的背景下,现代数据湖需要具备强大的流批处理能力、高效的数据更新机制、严谨的事务支持以及灵活多变的存储和计算引擎。
面对上述需求,传统的Hive+HDFS架构数据仓库存在数据修改成本高、不支持事务(ACID)、无法实现流批统一、数据分析用时长等“痛点”,无法直接用于建设数据湖。近些年,Hudi和Iceberg等先进的表格式管理技术,凭借开放的文件存储格式、丰富的事务支持以及高效的读取写入等特点,成为企业数据湖建设的主流选型。
Hudi基本术语与写入操作流程
Hudi的诞生是为了解决Hadoop体系内数据更新和增量查询的问题,在数据存储、查询等方面均具有鲜明的特性。
FileLayouts
Hudi的文件布局是其实现增量查询、数据更新等特性的基础,每个Hudi表有一个固定的目录,存放元数据(.hoodie)以及数据文件,其中数据文件以分区方式进行划分,每个分区有多个数据文件(基础文件和日志文件),这些数据文件在逻辑上被组织为文件和文件组。
- Base File:列式存储的数据文件,默认是Parquet格式。
- Log File:行存储的数据文件,为avro格式,保存的是数据的变更日志(redo log),会定期与Base File进行合并。
- File Group:同一分区下,具有相同fileId的所有BaseFiles + LogFiles集合,一个分区可以有多个文件组。
- File Slice:同一分区下,具有相同fileId以及相同instant的BaseFiles + LogFiles集合。
Timeline
可以理解为Hudi表的一个时间线,记录了Hudi表在不同时刻的操作,并保证操作的原子性。Timeline包含action、time、state三个字段。
Table Types
Hudi提供了两种表类型,分别为Copy-On-Write(COW表)和Merge-On-Read(MOR表):
- COW表:仅使用列式文件格式(如parquet)存储数据。通过在写入期间执行同步合并,简单地更新版本和重写文件,适合更新数据量较大、时效性要求不高的场景。
- MOR表
- :使用基于列+基于行(如avro)的文件格式的组合存储数据,更新被记录到增量文件中(基于行),然后被压缩以同步或异步地生成新版本的列式文件,适用更新数据量小、时效性要求高的场景。
Query types
Hudi支持三种查询类型,分别为Snapshot Query、Read Optimized Query、Incremental Query:
- Snapshot Query:查询最近一次Snapshot的数据,也就是最新的数据。
- Read Optimized Query:针对MOR表特有的一种查询方式,只读取BaseFile,不合并Log,因为使用的都是列式文件格式,所以效率较高。
- Incremental Query:用户需要指定一个commit time,然后Hudi会扫描文件中的记录,过滤出commit_time大于begintime的TimeLine记录及BaseFile,可以有效地提高增量数据处理能力。
Writing
在Hudi数据湖框架中支持三种方式写入数据:Upsert、Insert以及Bulk-Insert。其中,Upsert为默认行为,也是Hudi的核心功能。
如图1所示,Spark写入Hudi,Upsert执行核心操作如下:
- 开始提交:判断上次任务是否失败,如果失败会触发回滚操作。然后会根据当前时间生成一个事务开始的请求标识元数据。
- 构造HoodieRecord Rdd对象:Hudi会根据元数据信息构造HoodieRecord Rdd对象,方便后续数据去重和数据合并。
- 数据去重:一批增量数据中可能会有重复的数据,Hudi会根据主键对数据进行去重,避免重复数据写入Hudi表。
- 数据fileId位置信息获取:在修改记录中可以根据索引获取当前记录所属文件的fileld,因数据合并时Update操作需要知道向哪个fileid文件写入新的快照文件。
- 数据合并:在COW表模式中会重写索引命中的fileId快照文件;在MOR表模式中根据fileId追加到分区中的log文件。
- 完成提交:在元数据中生成xxxx.commit文件,只有生成commit元数据文件,查询引擎才能根据元数据查询到刚刚Upsert后的数据。
- 数据清理:用于删除旧的文件片,以及限制表空间的增长,清理操作在每次写操作之后自动被执行,同时利用缓存在TimeLine Server上的TimeLine Metadata来防止扫描整个表。
- Compaction压缩:主要是MOR模式中才会用到,会将MOR模式中的xxx.log数据合并到xxx.parquet快照文件中去。
lceberg基本术语与写入操作流程
Iceberg的官网定位是“面向海量数据分析场景的高效存储格式”,所以它没有像Hudi一样模拟业务数据库的设计模式(主键+索引)来实现数据更新,而是设计了更强大的文件组织形式来实现数据的Update操作。
Data files(数据文件)
数据文件是Apache Iceberg表真实存储数据的文件,一般是在表的数据存储目录的data目录下,如果我们的文件格式选择的是parquet,那么文件是以“.parquet”结尾,Iceberg每次更新会产生多个数据文件。
Snapshot(表快照)
快照代表一张表在某个时刻的状态,每个快照里面会列出表在某个时刻的所有Data files 列表。Data files存储在不同的Manifest files里面,Manifest files存储在一个Manifest list文件里面,而一个Manifest list文件代表一个快照。
Manifest file(清单文件)
Manifest file是一个元数据文件,它列出组成快照(Snapshot)的数据文件(Data files)的列表信息。每行都是每个数据文件的详细描述,包括数据文件的状态、文件路径、分区信息、列级别的统计信息(比如每列的最大最小值、空值数等)、文件的大小以及文件里面数据行数等信息。其中,列级别的统计信息可以在扫描表数据时过滤掉不必要的文件。Manifest file是以avro格式进行存储的,以“.avro”后缀结尾。
Manifest list(清单列表)
Manifest list也是一个元数据文件,它列出构建表快照(Snapshot)的清单。这个元数据文件中存储的是Manifest file列表,每个Manifest file占据一行。每行中存储了Manifest file的路径、其存储的数据文件(Data files)的分区范围,增加了几个数文件、删除了几个数据文件等信息,这些信息可以用来在查询时提供过滤,加快速度。
在向Iceberg写入数据时,其内部的工作流程可以概括为以下几个步骤:
- 生成FileAppender:根据所配置的文件格式,Iceberg会生成对应FileAppender,这是实际执行写文件操作的组件。
- 写入数据文件:FileAppender负责将数据写入到目标文件中。
- 收集统计信息:所有数据写完后,Iceberg会收集写入的统计信息,如记录数(record_count)、下界(lower_bound)、上界(upper_bound)、值计数(value_count)等,以上信息对后续生成Manifest file提供重要输入文件。
- 生成Manifest file:基于统计信息,Iceberg生成对应的Manifest文件,Manifest文件是Datafile的索引,保存了每个数据文件的路径等信息,Iceberg根据这些Manifest file 实现对文件的组织和管理。
- 信息回传:Executor端将生成的Manifest文件和其他相关信息传回给Driver端,完成整个写入过程。
Hashdata连接器工作原理及实现流程
数据湖中的数据通常未经组织或处理,直接分析的效率受限。HashData通过自研Hudi、Iceberg连接器,实现了与这两种架构的流畅集成。HashData目前对于Hudi、Iceberg支持Readonly表,不支持Write。
如上图所示,HashData连接组件通过创建外部表的方式读取Hudi、Iceberg数据,进一步对湖内数据进行分析使用。
创建外部表
- 首先,需要Hudi、Iceberg存在需要读取的表。我们通过Spark、Flink等组件在Hudi、Iceberg上创建表并写入数据,且指定为Hudi、Iceberg格式。
- 在HashData DB上提交创建一张对应的可读外部表,外部表信息包含:Path、Catalog Type等信息,也就是我们前文提到的位置相关信息。
- 接下来调用Hudi、Iceberg客户端,客户端会新建连接调用Get Table,并传入外部表信息来获取Hudi、Iceberg表的元数据信息,包括表的字段数量、字段名、数据类型等。
- 根据获取到的元数据信息,在DB上mapping生成HashData的表信息。
- 至此,创建一张对应Hudi、Iceberg的外部表流程结束。
上述步骤,都是通过连接组件完成,相当于把表的Path、Catalogtype等信息打包传给连接器。连接器在获取相关表信息后再传递回来,HashData把传回的信息mapping为可读外部表。
Select表流程
- 当发起Select查询语句后,HashData会在内部发起Query For Select,通过连接器把查询的相关参数打包;然后通过External Scan 的Filter(比如SQL里的where条件)传给连接器。
- 连接器再调用Hudi、Iceberg的Scan接口,Scan方法会得到传入的参数,根据这些参数去过滤查询这次表相关的所有文件列表,并返回相关列表文件。
- 获取文件列表后,External会生成查询计划,完成查询操作和Hudi、Iceberg的元数据交互。
- HashData在获取数据后,会将文件列表打包,然后分发给每个Segment节点,Segment会获取文件列表里的一个分片,并依据这些信息读取数据。在数据返回后,整个读取数据的流程就此结束。
结语
Hudi、Iceberg作为当前主流的数据湖方案,受到广泛青睐。HashData“湖仓一体”技术方案,打通了数据仓库和数据湖,底层支持多种数据类型并存,能够真正实现数据间的相互共享,上层可以通过统一封装的接口进行访问,可同时支持实时查询和分析,为企业在数据湖架构下的数据治理与使用带来了更多的便利。
相关推荐
- 教你把多个视频合并成一个视频的方法
-
一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...
- 零代码编程:用kimichat合并一个文件夹下的多个文件
-
一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...
- Java APT_java APT 生成代码
-
JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...
- Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器
-
在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...
- 挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?
-
如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...
- 五年后,谷歌还在全力以赴发展 Kotlin
-
作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...
- kotlin和java开发哪个好,优缺点对比
-
Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...
- 移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?
-
掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...
- 颜值非常高的XShell替代工具Termora,不一样的使用体验!
-
Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...
- 预处理的底层原理和预处理编译运行异常的解决方案
-
若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...
- 为“架构”再建个模:如何用代码描述软件架构?
-
在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...
- 深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型
-
2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...
- 比分网开发技术栈与功能详解_比分网有哪些
-
一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...
- 设计模式之-生成器_一键生成设计
-
一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...
- 构建第一个 Kotlin Android 应用_kotlin简介
-
第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)