首页 > 其他分享 >Apache Hudi从零到一:存储格式初探

Apache Hudi从零到一:存储格式初探

时间:2024-03-24 09:46:18浏览次数:28  
标签:文件 Hudi 读取 MoR 写入 零到 Apache 操作

在花了大约 4 年时间致力于 Apache Hudi(其中包括 3 年Committer身份)之后,我决定开始这个博客系列,旨在以有组织且适合初学者的方式展示 Hudi 的设计和用法。 我的目标是确保对分布式数据系统有一定了解的人能够轻松地理解该系列。 该系列将包含 10 篇文章,每篇文章都会深入探讨 Hudi 的一个关键方面。 (为什么是 10?纯粹是对 0 和 1 的有趣致敬,与系列标题相呼应:))最终目标是帮助读者从广度和深度上理解 Hudi,使他们能够自信地利用这个开源项目并为其做出贡献。 在撰写本文时,Hudi 0.14.0 正处于候选版本阶段。 因此,整个系列以及配套代码和示例都将基于此版本。

概述

Hudi 是一个事务性数据湖平台,它将数据库和数据仓库功能引入数据湖。 下图摘自 Hudi 社区举办的网络研讨会,清楚地说明了该平台的主要功能

Hudi 的核心定义了一种表格式,用于组织存储系统内的数据和元数据文件,从而实现 ACID 事务、高效索引和增量处理等功能。 本文的其余部分将探讨格式详细信息,主要展示存储上的 Hudi 表的结构并解释不同文件的角色。

存储格式

下图描述了 Hudi 表在存储中的基本路径下的典型数据布局。

有两种主要类型的文件:位于 .hoodie/ 目录中的元数据文件,以及存储在分区路径中(如果表已分区)的数据文件,或者直接在基本路径(如果未分区)下的数据文件。

元数据

<base path>/.hoodie/hoodie.properties 文件包含基本的表配置,例如表名称和版本,表的写入端和读取端都将遵守和使用这些配置。

除了 hoodie.properties 之外,还有将事务操作记录到表中的元文件,形成 Hudi 表的时间轴。

# an example of deltacommit actions on Timeline
20230827233828740.deltacommit.requested
20230827233828740.deltacommit.inflight
20230827233828740.deltacommit

这些元文件遵循以下命名模式:

<action timestamp>.<action type>[.<action state>]

"action timestamp"

  • 标记第一次计划运行操作的时间。
  • 唯一标识时间轴上的操作。
  • 在时间轴上的不同操作之间单调递增。

"action type"显示该动作做出了什么样的改变。 有一些写入操作类型,例如 commit 和 deltacommit,它们指示表上发生的新写入操作(插入、更新或删除)。 此外,还有表服务操作,例如压缩和清理,以及恢复操作,例如保存点和恢复。 我们将在以后的帖子中更详细地讨论不同的操作类型。

"action state"可以是“已请求”、“进行中”或“已完成”(没有后缀)。 顾名思义,“已请求”表示正在计划运行,“正在执行”表示正在进行中,“已完成”表示操作已完成。

这些操作的元文件采用 JSON 或 AVRO 格式,包含有关应应用于表或已应用的更改的信息。 保留这些事务日志可以重新创建表的状态,实现快照隔离,并通过并发控制机制协调写入器冲突。

.hoodie/ 下还存储有其他元数据文件和目录。 举一些例子,元数据包含与时间轴上的操作相关的更多元数据,并充当写入端和读取端的索引。 .heartbeat/ 目录存储用于心跳管理的文件,而 .aux/ 则保留用于各种辅助目的。

数据

Hudi将物理数据文件分为Base File(基本文件)和Log File(日志文件):

  • 基本文件包含 Hudi 表中的主要存储记录,并针对读取进行了优化。
  • 日志文件包含其关联基本文件之上的记录更改,并针对写入进行了优化。

在 Hudi 表的分区路径中(如前面的布局图所示),单个基本文件及其关联的日志文件(可以没有或多个)被分组在一起作为文件切片。 多个文件切片构成一个文件组。 文件组和文件切片都是逻辑概念,旨在封装物理文件,从而简化读取端和写入端的访问和操作。 通过定义这些模型,Hudi 可以

  • 满足读写效率要求。 通常基本文件配置为列式文件格式(例如 Apache Parquet),日志文件设置为基于行的文件格式(例如 Apache Avro)。
  • 实现跨提交操作的版本控制。 每个文件切片都与时间轴上操作的特定时间戳相关联,文件组中的文件切片本质上跟踪所包含的记录如何随时间演变。

可以快速查看此处的 Hudi 表示例,了解数据布局。

表格类型

Hudi 定义了两种表类型 - 写入时复制 (CoW) 和读取时合并 (MoR)。 布局差异如下:与 MoR 相比,CoW 没有日志文件,并且写入操作会导致 .commit 操作而不是 .deltacommit。 在我们的讨论中,我们一直以 MoR 为例。 一旦掌握了 MoR,理解 CoW 就变得简单了 - 可以将 CoW 视为 MoR 的特殊情况,其中基本文件中的记录和更改在每次写入操作期间隐式合并到新的基本文件中。 可以在此处浏览示例 CoW 表。

在为 Hudi 表选择表类型时,考虑读取和写入模式非常重要,因为这会产生一些影响:

  • 由于每次写入都会重写新文件切片中的记录,因此 CoW 具有较高的写入放大,而读取操作始终会得到优化。 这非常适合读取繁重的分析工作负载或小型表。
  • MoR 的写入放大较低,因为更改会“缓冲”在日志文件中,并进行批处理以合并和创建新的文件切片。 但是,读取延迟会受到影响,因为读取最新记录需要将日志文件与基本文件进行实时合并。

用户还可以选择仅读取 MoR 表的基本文件,以提高效率,同时牺牲结果的新鲜度。 我们将在接下来的帖子中详细讨论 Hudi 的不同阅读模式。 随着 Hudi 项目的发展,与从 MoR 表读取相关的合并成本在过去的版本中得到了优化。 可以预见 MoR 将成为大多数工作负载场景的首选表类型。

回顾

在零到一系列的第一篇文章中,我们探讨了 Hudi 存储格式的基本概念,以阐明元数据和数据在 Hudi 表中的结构。 我们还简要解释了不同的表类型及其权衡。 如概览图所示,Hudi 作为一个综合性 Lakehouse 平台,提供不同维度的功能。 在接下来的九篇文章中,我将逐步介绍该平台的其他重要方面。

标签:文件,Hudi,读取,MoR,写入,零到,Apache,操作
From: https://www.cnblogs.com/leesf456/p/18092100

相关文章

  • Error: Could not find or load main class org.apache.hadoop.hbase.util.GetJavaPro
    Hbase没有将其自身的依赖包添加到classpath配置路径所以才会导致找不到自身主类的报错vim/usr/local/hbase/bin/hbase 在161行出修改CLASSPATH="${HBASE_CONF_DIR}"CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar:/usr/local/hbase/lib/*修改成功后,不再报错......
  • Dubbo23_Apache Dubbo概述2
    一、Dubbo简介ApacheDubbo是一款高性能的JavaRPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源JavaRPC框架,可以和Spring框架无缝集成。什么是RPC?RPC全称为remoteprocedurecall,即**远程过程调用**。比如两台服务器A和B,A服务器上部署一个应用,B服务器上......
  • linux apache 使用记录
    1、安装集成phpyuminstallhttpdyuminstallphpsystemctlrestarthttpd2、开启url重写功能修改/etc/httpd/conf/httpd.conf:A开启重写模块:LoadModulerewrite_modulemodules/mod_rewrite.soIncludeconf.modules.d/*.confB修改参数 AllowOverrideAllC网站根目录添......
  • 利用Scala与Apache HttpClient实现网络音频流的抓取
    概述在当今数字化时代,网络数据的抓取和处理已成为许多应用程序和服务的重要组成部分。本文将介绍如何利用Scala编程语言结合ApacheHttpClient工具库实现网络音频流的抓取。通过本文,读者将学习如何利用强大的Scala语言和ApacheHttpClient库来抓取网络上的音频数据,以及如......
  • Apache Jmeter常用插件下载及安装及软硬件性能指标
    一、安装插件管理器1)、进入Install::JMeter-Plugins.org 下载 plugins-manager.jar2)、将 plugins-manager.jar 放到  "…\apache-jmeter-5.5\lib\ext"  目录下3)、重启ApacheJMeter4)、菜单栏上点击“选项”会多出一个“PluginsManager”的按钮,点击......
  • 已解决org.apache.zookeeper.KeeperException.SessionExpiredException异常的正确解决
    已解决org.apache.zookeeper.KeeperException.SessionExpiredException异常的正确解决方法,亲测有效!!!目录问题分析报错原因解决思路解决方法总结 博主v:XiaoMing_JavaApacheZooKeeper是一个开源的分布式协调服务,它被广泛用于维护配置信息、命名注册、提供分布式同步......
  • Mybatis-plus构建wrapper条件时出现索引越界异常Caused by: org.apache.ibatis.except
    项目场景:学习springboot整合mybatis-plus时通过构建器执行相关操作@AutowiredBookMappermapper;@Testvoidtest(){QueryWrapper<Book>wrapper=newQueryWrapper<>();wrapper.select("id","name","press")//只查询前三......
  • Flink实时写Hudi报NumberFormatException异常
    Flink实时写Hudi报NumberFormatException异常问题描述在Flink项目中,针对Hudi表xxxx_table的bucket_write操作由于java.lang.NumberFormatException异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报错如下:bucket_write:......
  • Seatunnel系列之:Apache Iceberg sink connector和往Iceberg同步数据任务示例
    Seatunnel系列之:ApacheIcebergsinkconnector和往Iceberg同步数据任务示例一、支持的Iceberg版本二、支持的引擎三、描述四、支持的数据源信息五、数据库依赖六、数据类型映射七、Sink选项八、往Iceberg同步数据任务示例一、支持的Iceberg版本1.4.2二......
  • 搭建Apache+PHP+MySQL的Web服务器环境测试PHP时找不到url对象
    检查了apache的服务都是正常运行,配置文件也没有问题,搜了很多方法还是一样,最后发现是新建文本文档时重命名后(文件管理器没有显示后缀名)没有修改文件后缀。关键检查php的隐藏后缀名有没有更改!!!问题的发现浏览器输入http://localhost返回发现目录下我以为是first.php的文件实际上的......