Apache Iceberg 概述

news2024/9/23 6:21:27

Apache Iceberg概述

在这里插入图片描述

一、what is Apache Iceberg?

为了解决数据存储和计算引擎之间的适配的问题,Netflix开发了Iceberg,2018年11月16日进入Apache孵化器,2020 年5月19日从孵化器毕业,成为Apache的顶级项目。
在这里插入图片描述

Apache Iceberg is an open table format for huge analytic datasets.Apache Iceberg 是一种适用于大型分析数据集的开放表格式。

表格式(Table Format)可以理解为元数据以及数据文件的一种组织方式,处于计算框架(Flink,Spark…)之下,数据文件之上。

在这里插入图片描述

A good way to define a table format is a way to organize a dataset’s files to present them as a single “table”.
在这里插入图片描述

Iceberg 使用高性能表格式将表添加到计算引擎中,包括 Spark、Trino、PrestoDB、Flink、Hive 和 Impala,其工作方式与 SQL 表类似。


二、Apache Iceberg核心特性

2.1 数据存储、计算引擎插件化(解耦)

  • Apache Iceberg 作为一种开放的表格式,允许用户灵活地选择数据存储和计算引擎

在这里插入图片描述

  • 它与具体的存储解决方案(如 HDFS、Amazon S3)和计算引擎(如 Apache Spark、Apache Flink)解耦,使得用户能够根据需求随时调整架构
    在这里插入图片描述

  • 例如,在一个数据分析平台中,用户可以将数据存储在 Amazon S3 中,并使用 Apache Spark 来进行批量分析,同时也能接入 Apache Flink 进行实时流处理,无需更改数据格式。


2.2 实时流批一体

  • Iceberg 支持同时处理流数据和批数据,提供统一的读写接口。
  • 可以在同一个数据管道中混合处理实时流数据(如 IoT 设备产生的数据)和历史批数据(如日志文件)。
  • 例如,一个电商平台可以使用 Iceberg 接收实时的交易数据流,并同时执行对历史订单数据的分析,以生成实时销售报告和库存监控,简化 ETL 过程,减少数据延迟。

2.3 数据表演化(Table Evolution)

  • Apache Iceberg 提供了一种高效的方式来进行表级别的模式演进,使得用户能够灵活地修改表的结构而不需要耗费大量时间和资源

  • 这种模式演进通过简单的 SQL 操作实现,避免了繁琐的数据迁移和重写过程

  1. 低代价的操作:在 Iceberg 中,模式演进几乎不需要重写数据。当用户需要对表的结构进行修改(如添加、删除列或更改列的数据类型)时,只需执行相应的 SQL 命令,Iceberg 会在后台自动处理相关的元数据更新,而不需要将现有数据读取出来再写入
    在这里插入图片描述
  2. 无缝集成:与传统的 Hive 表相比,Iceberg 允许用户在不影响现有查询的情况下进行修改。例如,用户可以在保留原有数据的基础上,逐步演进到新的数据模型

假设一个在线零售平台的订单表最初按天分区

CREATE TABLE orders (
    order_id BIGINT,
    customer_id BIGINT,
    order_date DATE,
    amount DECIMAL(10, 2)
) PARTITIONED BY (order_date);

如果业务需求发生变化,需要将表的分区方式改为按小时分区。在传统的 Hive 中,这通常需要创建新表并将数据插入其中:

  1. 创建新表:
CREATE TABLE orders_hourly (
    order_id BIGINT,
    customer_id BIGINT,
    order_date DATE,
    order_hour INT,
    amount DECIMAL(10, 2)
) PARTITIONED BY (order_date, order_hour);//按小时分区
  1. 将旧表数据迁移到新表:
INSERT INTO orders_hourly
SELECT order_id, customer_id, order_date, HOUR(order_date) as order_hour, amount
FROM orders;
  1. 然后重命名新表以替换旧表,这可能影响其他依赖于旧表的查询。

而在 Iceberg 中,用户只需执行以下 SQL 操作:

ALTER TABLE orders ADD COLUMN order_hour INT;
ALTER TABLE orders SET PARTITIONED BY (order_date, order_hour);

Iceberg 会在不影响现有数据的情况下处理分区的变更,原有的数据仍然可以通过新的查询访问。这样,整个演进过程变得简单、快速且高效,大大降低了操作复杂性和风险。

数据架构的演进变得灵活和高效,企业可以更快速地响应业务需求的变化,保持数据模型的现代化。这种无缝的演进能力是许多企业在进行数据管理和分析时所期望的。


2.4 模式演化(Schema Evolution)

Iceberg 的模式演化设计提供了一种灵活、安全的方式来管理表结构,确保在修改表时不会影响现有数据或引入潜在的错误。

在这里插入图片描述

  1. ADD:通过增加新列,用户可以轻松扩展表的结构,例如添加新特性而不干扰现有数据。

  2. DROP:移除不再需要的列,确保数据模型的整洁,且不影响其他列的内容。

  3. RENAME:重命名列有助于提升可读性或反映业务变化,Iceberg 保证其他列的数据不会受到影响。

  4. UPDATE:对复杂结构的基本类型进行扩展,如从 tinyint 更新为 int,支持更大的数据范围,而无需重写数据。

  5. REORDER:改变列的排列顺序,使数据结构更符合用户需求,同时保持数据完整性。

在这里插入图片描述
Iceberg 使用唯一ID来定位列,从而避免因名称重复或位置依赖引发的问题,这一设计增强了模式演化的灵活性和可靠性。

在这里插入图片描述
使用名称或者位置信息来定位列的, 都会存在一些问题, 比如使用名称的话,名称可能会重复, 使用位置的话, 不能修改顺序并且废弃的字段也不能删除。


2.5 分区演化(Partition Evolution)

  • Iceberg可以在一个已存在的表上直接修改,因为Iceberg的查询流程并不和分区信息直接关联。
  • 当我们改变一个表的分区策略时,对应修改分区之前的数据不会改变, 依然会采用老的分区策略,新的数据会采用新的分区策略。
  • 也就是说同一个表会有两种分区策略,旧数据采用旧分区策略,新数据采用新新分区策略, 在元数据里两个分区策略相互独立,不重合。

在这里插入图片描述

  • booking_table表2008年按月分区,进入2009年后改为按天分区,这两中分区策略共存于该表中。
  • 借助Iceberg的隐藏分区(Hidden Partition),在写SQL 查询的时候,不需要在SQL中特别指定分区过滤条件,Iceberg会自动分区,过滤掉不需要的数据。
  • Iceberg分区演化操作同样是一个元数据操作, 不会重写数据文件。

sales,初始的分区策略是按年份(year)进行分区:

  • id
  • amount
  • date (包含年份信息)

初始分区策略

  • year 分区
    • 数据分区示例:
      • 2021
      • 2022
      • 2023
  1. 初始数据加载

    • 数据按 year 分区存储在表中。
    • 例如,2022年的销售数据存储在 year=2022 的目录下。
  2. 修改分区策略

    • 假设将分区策略改为按月(year/month)进行分区。

    • 新的分区策略会将数据细分为每个月。

    • 现在表结构将会有两个分区策略。

    • 2021年、2022年、2023年的旧数据仍然采用老的分区策略,即按 year 分区。

    • 这些数据会保留在原有的分区结构中,例如:

      • year=2021
      • year=2022
      • year=2023
    • 新加载的数据将会使用新的分区策略,即按 year/month 进行分区。

    • 例如,2023年4月的新数据将存储在:

      • year=2023/month=04 的目录下。

Iceberg 确保查询可以有效处理这两种不同的分区策略:

  • 查询旧数据:查询在 year 分区下的数据时,Iceberg 会直接访问原来的分区。
  • 查询新数据:查询在 year/month 分区下的新数据时,Iceberg 会访问新的分区目录。

2.6 列顺序演化(Sort Order Evolution)

  • Iceberg可以在一个已经存在的表上修改排序策略。修改了排序策略之后, 旧数据依旧采用老排序策略不变。

  • 往Iceberg里写数据的计算引擎总是会选择最新的排序策略, 但是当排序的代价极其高昂的时候, 就不进行排序了。

  • 类似于:
    在这里插入图片描述
    orders 表,初始的排序策略是按 customer_id 排序:

  • order_id

  • customer_id

  • order_date

初始排序策略:按 customer_id 排序。

修改排序策略

  • 假设将排序策略更改为按 order_date 排序。

  • 新的排序策略生效后,任何新写入的数据将采用 order_date 排序。

  • 已存在的数据仍然保持按 customer_id 排序,不会受到影响。

  • 计算引擎在写入新数据时会优先选择 order_date 排序策略。

  • 在某些情况下,如果排序代价过高,可能会选择不进行排序。

在查询时,Iceberg 能够智能处理不同的排序策略:

  • 查询旧数据:针对旧数据的查询依然能保持按 customer_id 的排序。
  • 查询新数据:新数据会根据 order_date 进行排序。

2.7 隐藏分区(Hidden Partition)

Iceberg 提供了一种灵活的隐藏分区机制,使得用户无需手动管理分区信息。
在这里插入图片描述

  1. 自动分区管理:
  • 隐蔽性:与传统的 Hive 分区策略不同,Iceberg 的分区字段和策略不需要暴露给用户。用户在创建表时或修改分区策略时,Iceberg 会自动计算新数据应归属的分区。
  1. 分区字段与表数据的独立性:
  • 非表字段分区字段可以是通过某种逻辑计算得出的,而不是直接表中的字段。分区策略可以更加灵活和动态。
  • 目录无关性:Iceberg 的分区信息与表的数据存储目录是独立的,用户不需要关心物理存储的结构。
  1. 数据插入与查询:
  • 自动计算:在插入新数据时,Iceberg 会根据定义的分区策略自动计算并归入相应的分区。
  • 查询优化:在查询过程中,用户只需专注于业务逻辑,Iceberg 会自动过滤不需要的分区,从而提高查询性能。
  1. 修改分区策略:
  • 灵活性:用户可以随时修改分区策略,而不需要进行数据迁移。Iceberg 处理了分区的重新计算和数据组织,确保数据的完整性和可用性。

2.8 时间旅行(Time Travel)

Iceberg提供了查询表历史某一时间点数据镜像(snapshot)的能力。

用户可以通过简单的查询语法,指定时间戳或快照 ID 来访问这些历史数据。
在这里插入图片描述

通过该特性可以将最新的SQL逻辑,应用到历史数据上。

  1. 审计与合规:查看过去某一时刻的数据状态,便于数据审计和合规检查。
  2. 数据恢复:在数据错误或丢失时,可以恢复到之前的版本。
  3. 比较变更:分析数据的历史变化,便于理解数据演变过程。

2.9 支持事务(ACID)

Iceberg 的 ACID 事务支持使得数据管理更加可靠。

通过允许并发读写,Iceberg 能够实现高效的 upsert 操作(允许用户同时执行插入和更新),确保下游组件只接收到已提交的数据。


2.10 基于乐观锁的并发支持

乐观锁机制

  • Iceberg 使用乐观并发控制来处理多个程序的并发写入。在每次事务开始时,Iceberg 不会立即锁定数据,而是允许所有操作并在提交时检查数据的完整性。

  • 当一个事务准备提交时,它会检查是否有其他事务已更改了相同的数据。如果没有冲突,事务就会成功提交;如果有冲突,则会被拒绝,用户需要重新尝试。

  • 减少锁竞争:由于不在读操作时加锁,乐观锁机制降低了在高并发环境中出现的竞争条件。

  • 线性一致性:尽管是乐观的控制方式,Iceberg 仍能保证数据的一致性,使得多个并发写入不会导致脏读或不可重复读。


2.11 文件级数据剪裁

  • Iceberg 在每个数据文件的元数据中维护统计信息,例如最小值、最大值、计数等。这些信息使得查询优化器能够更智能地选择需要读取的文件。

  • 在执行查询时,查询引擎可以根据 SQL 语句中的过滤条件,评估每个文件的统计信息,从而决定是否需要读取该文件。

  • 加快查询速度:通过剪裁不相关的数据文件,Iceberg 可以显著减少需要扫描的数据量,从而加快查询速度。

  • 资源优化:减少 I/O 操作,节省计算资源,提升整体性能。


仅供学习使用~

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

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

相关文章

SpringBoot实战(三十)发送HTTP/HTTPS请求的五种实现方式【下篇】(Okhttp3、RestTemplate、Hutool)

目录 一、五种实现方式对比结果二、Demo接口地址实现方式三、Okhttp3 库实现3.1 简介3.2 Maven依赖3.3 配置文件3.4 配置类3.5 工具类3.6 示例代码3.7 执行结果实现方式四、Spring 的 RestTemplate 实现4.1 简介4.2 Maven依赖4.3 配置文件4.4 配置类4.5 HttpClient 和 RestTemp…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发,可在终端设备的通知中心、锁屏、横幅等展示,用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容,将通知消息分类为服务与通讯、资讯营销两大类别&…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支,切换到该分支下面,输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支,因为刚刚提交的分支在dev环境,所以master是没有 3、合并分支 点击push,将dev里面的代码合并到…

Spring AI Alibaba,阿里的AI Java 开发框架

源码地址 https://github.com/alibaba/spring-ai-alibaba

资源创建方式-Job

Job: 容器按照持续运行的时间可分为两类,服务类容器,和工作类容器 服务类容器通常持续提供服务,需要一直运行,比如HTTP,Server,Daemon等, 工作类容器则是一次性任务,比如批处理程序&#xff0…

跟着问题学12——GRU详解

1 GRU 1. 什么是GRU GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆 和反向传播中的梯度等问题…

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall 数据集-目标检测系列-吸烟检测数据集 (smoking cigarette) 数据量:1W 想要进一步了解,请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方…

闯关leetcode——67. Add Binary

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/add-binary/description/ 内容 Given two binary strings a and b, return their sum as a binary string. Example 1: Input: a “11”, b “1” Output: “100” Example 2: Input: a “101…

Qt系统相关——事件

文章目录 事件和信号槽的关系事件处理鼠标事件鼠标进入和离开鼠标点击获取位置鼠标释放鼠标双击鼠标移动鼠标滚轮 键盘事件定时器事件窗口移动和窗口改变 事件和信号槽的关系 Qt信号槽机制: 用户进行的操作就可能产生信号,可以给某个信号指定槽函数&…

Effective Java 学习笔记 如何为方法编写文档

目录 方法的文档注解设计的原则 Javadoc常用的文档注释 一些注意细节 通过Javadoc命令生成h5页面 这是第8章Java方法的最后一部分,聚焦为导出的API编写文档注释。 如果要想使得API真正可用,配套的文档是必须的。Java提供了Javadoc这个文档生成工具&…

Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录 概述 1 General PWM介绍 1.1 特性 1.2 定时器选择注意点 2 时钟配置 3 应用案例 3.1 基本定时器应用 3.2 定时器回调函数案例 3.3 输入捕捉功能案例 3.4 更新周期案例 3.5 更新占空比案例 3.6 单次触发脉冲案例 4 测试 4.1 代码介绍 4.2 验证 概述 本文主…

基于SpringBoot+Vue+MySQL的特色旅游网站系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展,人们对旅游体验的需求日益多样化与个性化。传统的旅游信息查询与预订方式已难以满足现代游客的需求。因此,我们开发了这款基于SpringBootVueMySQL的特色旅游网站系统。该系统旨在通…

HTML实现的简单网站首页模板

这个是简单的网站首页模板&#xff0c;用于学习或者参考 实现代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击&#xff1a;移动硬盘为何需格式化才能访问&#xff1f; 在数字化时代&#xff0c;移动硬盘作为数据存储与传输的重要工具&#xff0c;其稳定性与可靠性直接关系到用户数据的安全。然而&#xff0c;不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…

最佳植树距离 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;C卷D卷E卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 按照环保公司要求&#xff0c;小明需要在沙化严重的地区进行植树防沙工作&#xff0c;初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木&#xff0c;所以只能在…

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…