数据湖08:Apache Iceberg原理和功能介绍

这篇具有很好参考价值的文章主要介绍了数据湖08:Apache Iceberg原理和功能介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 系列专题:数据湖系列文章


        在使用不同的引擎进行大数据计算时,需要将数据根据计算引擎进行适配。这是一个相当棘手的问题,为此出现了一种新的解决方案:介于上层计算引擎和底层存储格式之间的一个中间层。这个中间层不是数据存储的方式,只是定义了数据的元数据组织方式,并向计算引擎提供统一的类似传统数据库中"表"的语义。它的底层仍然是Parquet、ORC等存储格式。

基于此,Netflix开发了Iceberg,目前已经是Apache的顶级项目,
        https://iceberg.apache.org/

1. Iceberg是什么

Apache Iceberg is an open table format for huge analytic datasets. Iceberg adds tables to compute engines including Flink, Trino, Spark and Hive using a high-performance table format that works just like a SQL table.

        Iceberg是一种开放的数据湖表格式。可以简单理解为是基于计算层(Flink , Spark)和存储层(ORC,Parqurt,Avro)的一个中间层,用Flink或者Spark将数据写入Iceberg,然后再通过其他方式来读取这个表,比如Spark,Flink,Presto等。

数据湖08:Apache Iceberg原理和功能介绍

 在文件Format(parquet/avro/orc等)之上实现Table语义:

  1. 支持定义和变更Schema
  2. 支持Hidden Partition和Partition变更
  1. ACID语义
  2. 历史版本回溯
  1. 借助partition和columns统计信息实现分区裁剪
  2. 不绑定任何存储引擎,可拓展到HDFS/S3/OSS等
  3. 容许多个writer并发写入,乐观锁机制解决冲突。

2. Iceberg的Table Format介绍

        Iceberg是为分析海量数据而设计的,被定义为Table Format,Table Format介于计算层和存储层之间。

        Table Format向下管理在存储系统上的文件,向上为计算层提供丰富的接口。存储系统上的文件存储都会采用一定的组织形式,譬如读一张Hive表的时候,HDFS文件系统会带一些Partition,数据存储格式、数据压缩格式、数据存储HDFS目录的信息等,这些信息都存在Metastore上,Metastore就可以称之为一种文件组织格式。

        一个优秀的文件组织格式,如Iceberg,可以更高效的支持上层的计算层访问磁盘上的文件,做一些list、rename或者查找等操作。

        表和表格式是两个概念。表是一个具象的概念,应用层面的概念,我们天天说的表是简单的行和列的组合。而表格式是数据库系统实现层面一个抽象的概念,它定义了一个表的Scheme定义:包含哪些字段,表下面文件的组织形式(Partition方式)、元数据信息(表相关的统计信息,表索引信息以及表的读写API),如下图左侧所示:

数据湖08:Apache Iceberg原理和功能介绍

         上图右侧是Iceberg在数据仓库生态中的位置,和它差不多相当的一个组件是Metastore。不过Metastore是一个服务,而Iceberg就是一系列jar包。对于Table Format,可以认为主要包含4个层面的含义,分别是表schema定义(是否支持复杂数据类型),表中文件的组织形式,表相关统计信息、表索引信息以及表的读写API信息。

  • 表schema定义了一个表支持字段类型,比如int、string、long以及复杂数据类型等。
  • 表中文件组织形式最典型的是Partition模式,是Range Partition还是Hash Partition。
  • Metadata数据统计信息。
  • 表的读写API。上层引擎通过对应的API读取或者写入表中的数据。

3. Iceberg的核心思想

        Iceberg的核心思想,就是在时间轴上跟踪表的所有变化:

  • 快照表示表数据文件的一个完整集合。
  • 每次更新操作会生成一个新的快照。

4. Iceberg的元数据管理

        从图中可以看到Iceberg将数据进行分层管理,主要分为元数据管理层和数据存储层。元数据管理层又可以细分为三层:

  • Metadata File

  • Snapshot

  • Manifest

        Metadata File存储当前版本的元数据信息(所有snapshot信息);Snapshot表示当前操作的一个快照,每次commit都会生成一个快照,一个快照中包含多个Manifest。每个Manifest中记录了当前操作生成数据所对应的文件地址,也就是data files的地址。基于snapshot的管理方式,Iceberg能够进行time travel(历史版本读取以及增量读取),并且提供了serializable isolation。
数据存储层支持不同的文件格式,目前支持Parquet、ORC、AVRO。

5. Iceberg的重要特性

        Apache Iceberg设计初衷是为了解决Hive离线数仓计算慢的问题,经过多年迭代已经发展成为构建数据湖服务的表格式标准。关于Apache Iceberg的更多介绍,请参见Apache Iceberg官网。

目前Iceberg提供以下核心能力:

5.1 丰富的计算引擎

  • 优秀的内核抽象使之不绑定特定引擎,目前在支持的有Spark、Flink、Presto、Hive;
  • Iceberg提供了Java native API,不用特定引擎也可以访问Iceberg表。

5.2 灵活的文件组织形式

  • 提供了基于流式的增量计算模型和基于批处理的全量表计算模型,批任务和流任务可以使用相同的存储模型(HDFS、OZONE——OZone 是 Hadoop 社区重点投入开发的下一代存储引擎),数据不再孤立,以构建低成本的轻量级数据湖存储服务;
  • Iceberg支持隐藏分区(Hidden Partitioning)和分区布局变更(Partition Evolution),方便业务进行数据分区策略更新;
  • 支持Parquet、ORC、Avro等存储格式。

5.3 优化数据入湖流程

  • Iceberg提供ACID事务能力,上游数据写入即可见,不影响当前数据处理任务,这大大简化了ETL;
  • Iceberg提供upsert/merge into行级别数据变更,可以极大地缩小数据入库延迟。

5.4 增量读取处理能力

  • Iceberg支持通过流式方式读取增量数据,实现主流开源计算引擎入湖和分析场景的完善对接;
  • Spark struct streaming支持;
  • Flink table source支持;
  • 支持历史版本回溯。

6. 数据文件结构

        先了解一下Iceberg在文件系统中的布局,总体来讲Iceberg分为两部分数据,第一部分是数据文件,如下图中的 parquet 文件。第二部分是表元数据文件(Metadata 文件),包含 Snapshot 文件(snap-*.avro)、Manifest 文件(*.avro)、TableMetadata 文件(*.json)等。

数据湖08:Apache Iceberg原理和功能介绍

 6.1 元数据文件

        其中metadata目录存放元数据管理层的数据,表的元数据是不可修改的,并且始终向前迭代;当前的快照可以回退。

6.1.1 Table Metadata

        version[number].metadata.json:存储每个版本的数据更改项。

6.1.2 快照(SnapShot)

        snap-[snapshotID]-[attemptID]-[commitUUID].avro:存储快照snapshot文件;

        快照代表一张Iceberg表在某一时刻的状态。也被称为清单列表(Manifest List),里面存储的是清单文件列表,每个清单文件占用一行数据。清单列表文件以snap开头,以avro后缀结尾,每次更新都产生一个清单列表文件。每行中存储了清单文件的路径。

        清单文件里面存储数据文件的分区范围、增加了几个数据文件、删除了几个数据文件等信息。数据文件(Data Files)存储在不同的Manifest Files里面,Manifest Files存储在一个Manifest List文件里面,而一个Manifest List文件代表一个快照。

6.1.3 清单文件(Manifest File)

        [commitUUID]-[attemptID]-[manifestCount].avro:manifest文件

        清单文件是以avro格式进行存储的,以avro后缀结尾,每次更新操作都会产生多个清单文件。其里面列出了组成某个快照(snapshot)的数据文件列表。每行都是每个数据文件的详细描述,包括数据文件的状态、文件路径、分区信息、列级别的统计信息(比如每列的最大最小值、空值数等)、文件的大小以及文件里面数据的行数等信息。其中列级别的统计信息在 Scan 的时候可以为算子下推提供数据,以便可以过滤掉不必要的文件。

6.2 数据文件

        data目录组织形式类似于hive,都是以分区进行目录组织(图中dt为分区列)

        Iceberg的数据文件通常存放在data目录下。一共有三种存储格式(Avro、Orc和Parquet),主要是看您选择哪种存储格式,后缀分别对应avro、orc或者parquet。在一个目录,通常会产生多个数据文件。

7. 参考文献

[01]  https://www.toutiao.com/article/7099724190609539591文章来源地址https://www.toymoban.com/news/detail-408572.html

到了这里,关于数据湖08:Apache Iceberg原理和功能介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Iceberg从入门到精通系列之十:flink sql往Iceberg表插入数据,Batch模式和Streaming模式查询数据

    仅支持Flink的Batch模式 当将数据写入v2表格时,Iceberg支持基于主键的UPSERT。有两种方法可以启用upsert。 建表时指定 UPSERT模式下,如果对表进行分区,则分区字段必须是主键。 Batch模式: Streaming模式: 从当前快照读取所有记录,然后从该快照读取增量数据 读取指定快照id(不包

    2024年02月12日
    浏览(40)
  • 数据湖Iceberg介绍和使用(集成Hive、SparkSQL、FlinkSQL)

    概述 为了解决数据存储和计算引擎之间的适配的问题,Netflix开发了Iceberg,2018年11月16日进入Apache孵化器,2020 年5月19日从孵化器毕业,成为Apache的顶级项目。 Iceberg是一个面向海量数据分析场景的 开放表格式(Table Format) 。表格式(Table Format)可以理解为 元数据以及数据文

    2024年02月10日
    浏览(35)
  • 【Vue2.x源码系列08】Diff算法原理

    DOM是很慢的,其元素非常庞大,当我们频繁的去做 DOM更新,会产生一定的性能问题,我们可以直观感受一下 div元素包含的海量属性 在Javascript对象中, 虚拟DOM 表现为一个 Object对象(以VNode 节点作为基础的树)。并且最少包含标签名 tag 、属性 attrs 和子元素对象 children 三个

    2024年02月05日
    浏览(34)
  • 【jvm系列-08】精通String字符串底层原理和运行机制(详解)

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2023年04月17日
    浏览(73)
  • 【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

    Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。 Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了

    2024年02月11日
    浏览(30)
  • Iceberg从入门到精通系列之六:Flink集成Iceberg

    下载Flink: https://www.apache.org/dyn/closer.lua/flink/flink-1.17.1/flink-1.17.1-bin-scala_2.12.tgz 下载Iceberg flink jar包:iceberg-flink-runtime-1.17-1.3.0.jar https://iceberg.apache.org/releases/ 修改配置文件flink-conf.yaml local模式 修改workers 至此FLink成功集成Iceberg

    2024年02月16日
    浏览(36)
  • Iceberg从入门到精通系列之二:Iceberg集成Hive

    理解Iceberg核心概念可以阅读博主下面这篇技术博客: Iceberg从入门到精通系列之一:Iceberg核心概念理解 拷贝Iceberg的jar包到Hive的auxlib目录中 启动hdfs 启动yarn 启动historyserver Hive的元数据服务是一种存储和管理Hive表格和数据定义的中央服务,它允许用户定义表格、分区和桶等元

    2024年02月12日
    浏览(29)
  • Iceberg从入门到精通系列之十六:Flink Iceberg Connector

    Apache Flink 支持直接创建 Iceberg 表,无需在 Flink SQL 中创建显式 Flink 目录。这意味着我们可以通过在 Flink SQL 中指定 ‘connector’=‘iceberg’ 表选项来创建一个 Iceberg 表,与 Flink 官方文档中的用法类似。 在 Flink 中,SQL CREATE TABLE 测试 (…)WITH (‘connector’=‘iceberg’, …) 会在当前

    2024年02月16日
    浏览(38)
  • Iceberg从入门到精通系列之八:flink sql 创建Iceberg表

    建表命令支持最常用的flink建表语法,包括: PARTITION BY(column1,column2,…):配置分区,apache flink不支持隐藏分区。 COMMENT ‘table document’:指定表的备注 WITH(‘key’=‘value’,…):设置表属性

    2024年02月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包