HashData的湖仓一体思考:Iceberg、Hudi特性讲解与支持方案

2024-03-06 00:36

本文主要是介绍HashData的湖仓一体思考:Iceberg、Hudi特性讲解与支持方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

湖仓一体作为一种新兴的开放式数据管理架构,能够充分发挥数据湖的灵活性、生态丰富以及数据仓库的企业级数据分析能力,已经成为企业建设现代数据平台的热门选择。

在此前的直播中,我们分享了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操作流程示意图

如图1所示,Spark写入Hudi,Upsert执行核心操作如下:

  1. 开始提交:判断上次任务是否失败,如果失败会触发回滚操作。然后会根据当前时间生成一个事务开始的请求标识元数据。
  2. 构造HoodieRecord Rdd对象:Hudi会根据元数据信息构造HoodieRecord Rdd对象,方便后续数据去重和数据合并。
  3. 数据去重:一批增量数据中可能会有重复的数据,Hudi会根据主键对数据进行去重,避免重复数据写入Hudi表。
  4. 数据fileId位置信息获取:在修改记录中可以根据索引获取当前记录所属文件的fileld,因数据合并时Update操作需要知道向哪个fileid文件写入新的快照文件。
  5. 数据合并:在COW表模式中会重写索引命中的fileId快照文件;在MOR表模式中根据fileId追加到分区中的log文件。
  6. 完成提交:在元数据中生成xxxx.commit文件,只有生成commit元数据文件,查询引擎才能根据元数据查询到刚刚Upsert后的数据。 
  7. 数据清理:用于删除旧的文件片,以及限制表空间的增长,清理操作在每次写操作之后自动被执行,同时利用缓存在TimeLine Server上的TimeLine Metadata来防止扫描整个表。
  8. 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)的分区范围,增加了几个数文件、删除了几个数据文件等信息,这些信息可以用来在查询时提供过滤,加快速度。

图2:Iceberg写入流程示意图

在向Iceberg写入数据时,其内部的工作流程可以概括为以下几个步骤:

  1. 生成FileAppender:根据所配置的文件格式,Iceberg会生成对应FileAppender,这是实际执行写文件操作的组件。
  2. 写入数据文件:FileAppender负责将数据写入到目标文件中。
  3. 收集统计信息:所有数据写完后,Iceberg会收集写入的统计信息,如记录数(record_count)、下界(lower_bound)、上界(upper_bound)、值计数(value_count)等,以上信息对后续生成Manifest file提供重要输入文件。
  4. 生成Manifest file:基于统计信息,Iceberg生成对应的Manifest文件,Manifest文件是Datafile的索引,保存了每个数据文件的路径等信息,Iceberg根据这些Manifest file 实现对文件的组织和管理。
  5. 信息回传:Executor端将生成的Manifest文件和其他相关信息传回给Driver端,完成整个写入过程。

Hashdata连接器工作原理及实现流程

数据湖中的数据通常未经组织或处理,直接分析的效率受限。HashData通过自研Hudi、Iceberg连接器,实现了与这两种架构的流畅集成。HashData目前对于Hudi、Iceberg支持Readonly表,不支持Write。

图3:HashData连接器工作原理示意图

如上图所示,HashData连接组件通过创建外部表的方式读取Hudi、Iceberg数据,进一步对湖内数据进行分析使用。

创建外部表

  1. 首先,需要Hudi、Iceberg存在需要读取的表。我们通过Spark、Flink等组件在Hudi、Iceberg上创建表并写入数据,且指定为Hudi、Iceberg格式。
  2. 在HashData DB上提交创建一张对应的可读外部表,外部表信息包含:Path、Catalog Type等信息,也就是我们前文提到的位置相关信息。
  3. 接下来调用Hudi、Iceberg客户端,客户端会新建连接调用Get Table,并传入外部表信息来获取Hudi、Iceberg表的元数据信息,包括表的字段数量、字段名、数据类型等。
  4. 根据获取到的元数据信息,在DB上mapping生成HashData的表信息。
  5. 至此,创建一张对应Hudi、Iceberg的外部表流程结束。

上述步骤,都是通过连接组件完成,相当于把表的Path、Catalogtype等信息打包传给连接器。连接器在获取相关表信息后再传递回来,HashData把传回的信息mapping为可读外部表。

Select表流程

  1. 当发起Select查询语句后,HashData会在内部发起Query For Select,通过连接器把查询的相关参数打包;然后通过External Scan 的Filter(比如SQL里的where条件)传给连接器。
  2. 连接器再调用Hudi、Iceberg的Scan接口,Scan方法会得到传入的参数,根据这些参数去过滤查询这次表相关的所有文件列表,并返回相关列表文件。
  3. 获取文件列表后,External会生成查询计划,完成查询操作和Hudi、Iceberg的元数据交互。
  4. HashData在获取数据后,会将文件列表打包,然后分发给每个Segment节点,Segment会获取文件列表里的一个分片,并依据这些信息读取数据。在数据返回后,整个读取数据的流程就此结束。

结语

Hudi、Iceberg作为当前主流的数据湖方案,受到广泛青睐。HashData“湖仓一体”技术方案,打通了数据仓库和数据湖,底层支持多种数据类型并存,能够真正实现数据间的相互共享,上层可以通过统一封装的接口进行访问,可同时支持实时查询和分析,为企业在数据湖架构下的数据治理与使用带来了更多的便利。

这篇关于HashData的湖仓一体思考:Iceberg、Hudi特性讲解与支持方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/778312

相关文章

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7