【2】数据湖架构中 Iceberg 的核心特性

2023-11-04

在业界的数据湖方案中有 Hudi、Iceberg 和 Delta 三个关键组件可供选择。

一、Iceberg 是什么?

Iceberg 官网中是这样定义的:

Apache Iceberg is an open table format for huge analytic datasets

即 Iceberg 是大型分析型数据集上的一个开放式表格式。通过该表格式,将下层的存储介质(HDFS、S3、OSS等)、文件格式(Parquet、Avro、ORC等)与上层计算引擎(Flink、Spark、Presto、Hive等)进行解耦,如下图所示。

计算与存储的解耦给我们带来了更多的灵活性,在计算引擎上有了更多的选择,可以根据实际的需求选择不同的计算引擎。通过表格式屏蔽了下层的存储细节,对上层引擎呈现的都只是一张 Iceberg 表。

二、Iceberg 的文件组织形式

为了便于理解 Iceberg 的几个重要的特性,我们先简单介绍下 Iceberg 的文件的组织形式。

如下图所示,Iceberg 文件组织分为四层,分别为Metadata、Snapshot、Manifest、File。

  • Metadata 文件:该文件记录了最新的快照信息和历史的快照记录。并且记录了最新的 Schema 信息。
  • Snapshot 文件(图中Snap-x):由于 Iceberg 基于 MVCC(多版本并发控制) 的设计理念,每次 Commit 都会生成一个 Snapshot, 该 Snapshot 是当时表的全局快照,即选定某个快照读取时,读到的是全量数据。Snapshot 文件记录了历史的 Manifest 文件和本次 Commit 新增的 Manifest,当我们增量读取时,只需要读取指定快照的新增的 Manifest 就可以实现读取新增的数据。
  • Manifest 文件(图中mx):该文件记录了本次事务中写入的文件和分区的对应关系,并且记录了文件中字段的一些统计信息(如最大值、最小值)以便于快速查找。
  • File:实际写入的数据文件,如 Parquet、Avro 等格式文件。

三、事务性

Iceberg 的一个亮点是提供了 ACID 的语义支持,通过 Snapshot 进行读写分离,提供了 Serializable isolation,且所有的操作都可以保证原子性。

相比 Hive 而言,Iceberg 提供的事务性可以隔离写入任务队分析任务的不利影响,且写入失败不会出现脏数据。

更加吸引人的是 Iceberg 和 Flink 的结合,通过 Flink 的 Checkpoint 机制和 Iceberg 的事务性,可以做到端到端的 Exactly once 语义。

 

四、Schema 约束与 Schema evolution

Schema约束

提起一张表(table format),我想最先强调的是表是具有 Schema的。 Iceberg 表是有 Schema 强制约束的。与 Hive 表不同,写入 Iceberg 表的数据必须经过 Schema 的校验,这样就解决了 Hive 表文件内容和 Schema 不匹配导致的下游消费异常的问题。

Schema evolution

此外,Iceberg 在Metadata 文件中记录最新的 Scehma 结构,并通过 id 与实际的数据文件中的 Schema 进行映射。因此对 Iceberg 表可以进行更加灵活的 Schema 变更操作,你可以像 MySQL 那样对 Iceberg 表进行增加列、删除列、更新列等操作,并且这些操作不会有任何的副作用,而在使用 Hive 表进行 Schema 变更时,在某些情况下则需要将历史的分区数据全部重写才可以完成。

五、Hidden Partition 与 Partition evolution

Hidden Partition

与 Hive 表类似,Iceberg 也可以进行分区来获取更快的查询。但与 Hive 不同的地方时 Iceberg 支持隐式分区。

在 Hive 中,分区需要显示指定为表中的一个字段,并且要求在写入和读取时需要明确的指定写入和读取的分区,如下示例中,以 event_date 作为分区分别展示读写 Hive 表和 Iceberg 表。

在上述例子中,Hive 表并不知道event_dateevent_time的对应关系,需要用户来跟踪。

而在 Iceberg 中将分区进行隐藏,由 Iceberg 来跟踪分区与列的对应关系。在建表时用户可以指定date(event_time) 作为分区, Iceberg 会保证正确的数据总是写入正确的分区,而且在查询时不需要手动指定分区列,Iceberg 会自动根据查询条件来进行分区裁剪。

Partition evolution

通过 Iceberg 隐式分区,我们将表分区从物理的目录结构和逻辑上分区进行分离,因此 Iceberg 可以更好的进行分区的变更。如下图所示,当我们将分区由按月分区调整为按天分区后,旧分区的目录结构保持不变,新数据将会使用新的目录结构写入。当进行查询时,会根据分区的不同分别执行不同的查询计划。

 六、行级更新

Iceberg 表的一大亮点是提供了 OLAP 场景下列式存储数据集的更新和删除的能力。由于 Iceberg 表支持更新和删除,因此你可以将 Changelog (如 Binlog 数据) 导入到 Iceberg 表中进行分析,同时也可以操作 Iceberg 表以更新或删除某一行或者一批数据。而在 Hive 中,由于 Hive 不支持更新,因此每次只能全量写入,浪费了计算资源,且存在较多的冗余数据。

Iceberg 表的更新是采用 MOR (Merge on Read) 模式来实现的,任何的更新和删除操作并不会对原数据文件进行操作,而是采用追加的形式写入到另一个文件中(Delete File),在读取时进行 Merge 操作以获取正确的结果。

七、Snapshots 与Time travel

由于 Iceberg 多版本的设计,允许用户在多个快照之间进行切换。通过 Time travel 用户可以实现如下操作:

  • 历史数据查询:指定某一个 Snapshot 来查询某一时刻的快照数据
  • 增量消费:指定起始和终止的 Snapshot,查询某时间内新增的数据
  • 回滚:当出现脏数据时可以回滚到某一个快照
  • 回溯:指定某一个快照开始消费以进行回溯数据

此外 Snapshots 记录了本次 Commit 的变更,可以通过查询、监控 Snapshots 的信息以监控数据的并更情况,及时发现数据的质量问题。

SELECT * FROM prod.db.table.snapshots

 

八、总结

最后我们做一个总结:Iceberg 作为一种表格式,将上层计算引擎和下层存储进行了解耦,使对数据的管理和操作更加灵活;通过 Schema 的强约束和事务性保证了写入数据的一致性问题;得益于良好的文件组织形式,使表分区在逻辑上和物理目录进行了分离,且可以达到文件级别的索引,不需要遍历目录下所有的文件,这大大提升了查询的性能和使用的便捷性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【2】数据湖架构中 Iceberg 的核心特性 的相关文章

随机推荐

  • 10年老电脑如何提速_2020年双十一笔记本电脑选购终极指南,教你如何选择购买游戏本电脑,高性价比电脑推荐(10月更新)...

    本文会在双十一期间持续更新 每天更新各大电商平台的笔记本电脑好价 如果想及时收到信息 建议点击文章最底部的 追更 仅支持手机版知乎 或者收藏本文 双十一购物狂欢节 又快到了一年一度的双十一了 按照以往的规律 双十一期间 各大笔记本厂商都会下
  • 【ANFIS 时序预测】基于 ANFIS 的时间序列预测附 MATLAB 代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 辐照度是影响光伏 PV 电站发电量最重要的气象因素 提出了一种新的基于自适应模糊推理
  • docker启动tomcat

    先检查当前镜像是否存在 docker image ls 存在后继续下一步 不存在的话拉取镜像 docker pull tomcat 镜像拉去成功后 启动容器 如果是用虚拟机的话需要端口映射 p 8080 8080才可以在浏览器访问 d后台运
  • 第三章 基于QT和DCMTK的Dicom 图像浏览器---单个Dicom图像读取类

    由于mitk net被人恶意抢注 中科院分子影像重点实验室的www mitk net 改到 www mitk net cn 目录 开始 DCMTK MD版 编译和安装 VS2015 第一章 DCMTK MD版 QT VS2015编写Dico
  • 日志收集-elk

    04 4 日志收集 1 日志收集方式 Kubernetes的业务Pod日志有两种输出方式 一种是直接打到标准输出或者标准错误 第二种是将日志写到特定目录下的文件种 针对这两种不同场景 提供了不同的容器日志收集思路 1 1 Kubernete
  • websocket校验token:使用threadlocal存放和获取当前登录用户

    都知道threadlocal可以用于线程之间的变量隔离 在登录时中它可以放入当前用户 之后再用于获取当前登录用户 下面是一个使用实例 用户实体类 jpa框架 Data EqualsAndHashCode callSuper false Ta
  • socket套接字——UDP协议

    目录 一 预备知识 1 端口号 1 网络通信的目的 2 认识端口号 3 网络通信的本质 4 端口号的作用 2 认识TCP和UDP协议 3 网络字节序 1 各处数据的大小端 2 字节序转换接口 二 socket套接字 1 socket接口 1
  • EasyPoi实现excel文件导入导出

    EasyPoi学习实践 1 简介 easypoi功能如同名字easy 主打的功能就是容易 让一个没见接触过poi的人员 就可以方便的写出Excel导出 Excel模板导出 Excel导入 Word模板导出 通过简单的注解和模板 语言 熟悉的
  • qt连接oracle

    qt连接oracle 作者 bjoern 来源 CSDN 版权声明 本文为博主原创文章 未经博主允许不得转载 声明 qt编译的位数版本和数据库oracle的版本是密切相关的 如果你的电脑是64位的 但是qt装了默认32位的 那么你的orac
  • Java性能监控和故障诊断可视化工具之jmc

    前面的文章中我们介绍了jvisualvm 本篇文章我们来介绍下目前为止功能最为强大的可视化工具jmc jmc Java Mission Control 是jdk1 7开始引入的JVM监控工具 jmc可视化监控工具主要包含两大块内容 1 JM
  • 以transformAssociateToMap函数为例,分析LeGO-LOAM的坐标系统

    文章目录 LeGO LOAM采用的坐标轴体系 transformAssociateToMap函数剖析 公式推导 LeGO LOAM坐标变换解析 LeGO LOAM采用的坐标轴体系 LeGO LOAM的旋转顺序是固定轴ZXY而LeGO LOA
  • python文字转语音

    你觉得将文字转成语音需要写多少行代码才能完成 我用了7行 你呢 coding utf 8 import sys reload sys sys setdefaultencoding utf 8 import pyttsx engine pyt
  • STM32 SPI对存储芯片发送写是能命令后一直忙等待

    我采用CUBE配置的SPI外设 对NSS引脚选择了硬件输出 这种方式对读取命令没有影响 但是对写命令有 当我发送写是能命令后 读取状态寄存器的值一直都是忙 我猜测这可能是硬件控制NSS引脚后 对于HAL SPI Transmit等命令 内部
  • Github+Typora - - 我理想中的markdown云笔记神器

    这篇文章记录我如何解决市面上markdown笔记软件的弊端 扬长避短 为喜爱markdown软件的朋友出一份力 首先 我们先看下这篇文章 介绍了我们当下markdown软件多多少少有些不完美的状况 让我们虽然不喜欢 但也只可 欲罢不能 的尴
  • 使用python在wordpress博客网站添加新文章示例

    Wodrepress是最近很火的一个博客平台 利用它可以快速搭建各种网站 下面我是利用xmlrpc编程接口在wordpress添加文章的示例代码 import datetime xmlrpclib wp url http www examp
  • Camera和Image sensor技术基础笔记(5) -- HDR相关技术

    动态范围 Dynamic Range 动态范围最早是信号系统的概念 一种信号系统的动态范围定义为 最大的信号不失真的电平和噪声电平的差 在实际场景中 多用分贝 dB 为单位来衡量一个信号系统的动态范围 以上说法可能有些抽象 来看两个例子 1
  • ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象

    Getting Started with ggplot2 ggplot 基本用法 由ggplot2所制得图形有三个重要的组成部分 1 数据 2 数据和视觉变量属性之间的映射 aesthetic mappings 3 呈现数据结果的图层 一般
  • JS中的prototype

    JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点 1 原型法设计模式 在 Net中可以使用clone 来实现原型法 原型法的主要思想是 现在有1个类A 我想要创建一个类B 这个类是以A为原型的 并且能进行扩展
  • 绝地救生error_30种面向前端开发人员的救生工具

    绝地救生error As the functionalities of web apps keep getting ever more sophisticated and complex web developers need flexib
  • 【2】数据湖架构中 Iceberg 的核心特性

    在业界的数据湖方案中有 Hudi Iceberg 和 Delta 三个关键组件可供选择 一 Iceberg 是什么 Iceberg 官网中是这样定义的 Apache Iceberg is an open table format for h