Skip to content

Latest commit

 

History

History
155 lines (62 loc) · 5.91 KB

IceBerg.md

File metadata and controls

155 lines (62 loc) · 5.91 KB

IceBerg

用于大数据分析的高性能开放式的表格式(Table Format)

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

【比如HDFS文件,通过IceBerg可以转化为表格是,通过sql语句进行查询。】

  • 高表达性SQL:比如支持行级别更新,支持merge into
  • 隐藏分区 【?查看生产中默认还是设置分区字段】
  • 时间旅行和回滚
  • 数据压缩合并【?比如针对hive中头痛的小文件问题】

学习视频:

【尚硅谷数据湖Iceberg实战教程(尚硅谷&Apache Iceberg官方联合推出)】https://www.bilibili.com/video/BV1uN411K77V?vd_source=f4fa55dcba9415699434901e9c870565

基于1.1.0版本

1 IceBerg简介

1.1 概述

为了解决数据存储和计算引擎之间的适配问题。处于计算框架之下,数据文件之上。Apache项目。

是一个面向海量数据分析场景的高性能开放式的表格式(Table Format)。表格式可以理解为元数据以及数据文件的一种组织方式。

Hive对比IceBerg,Hive一个分区一个目录,如果小时级别分区,分区数量很多,如果查询时间为某个时间点,最多定位到分区级别,然后扫描分区目录,如果分区多,这就是痛点问题。

IceBerg数据可以定位到文件级别,而不是hive那样目录级别。重点解决分区扫描慢和文件扫描慢的问题。

1.2 特性

1.2.1 数据存储、计算引擎插件化

[插件化举例:你的鼠标键盘其实就是插件化]

数据存储、计算引擎插件化:提供表格式Table Format实现方案,不和特定的数据存储、计算引擎绑定。常见的存储HDFS S3 和计算引擎 Flink Spark Doris Presto都可以接入IceBerg。

生产环境中可以选择不同的组件搭配使用。甚至可以不通过计算引擎,直接读取存在文件系统上的数据。

1.2.2 实时流批一体

可以满足实时场景,并且IceBerg同时提供了流/批读写接口。

1.2.3 数据表演化

[Hive中比如需要进行秀修改分区,需要建立新表,输入导入,修改关联SQL,过程十分繁琐。]

1.2.4 模式演化

IceBerg支持:ADD Drop Rename Update Recorder

字段的修改:增加列、删除列、重命名、更新数据类型

IceBerg中可以保证模式演化是没有副作用的独立流程,不会涉及到重写数据文件的过程。

IceBerg中使用唯一的ID来定位每一列的信息。新增一个列时会新分配给它一个唯一ID,绝对不会使用已经被使用的ID。

1.2.5 分区演化

IceBerg可以直接在已经存在的表上修改分区,查询流程不会和分区信息直接关联。

当我们修改一个表的分区策略时,对应修改分区之前的数据不会改变,依然采用老的分区策略,新的数据会采用新的分区策略。也就是说一个表会有两种分区策略。旧数据采用旧的分区策略,新数据采用新的分区策略,在元数据里两个分区策略相互独立不会重合。

查询数据时,如果存在跨新旧分区的情况,会解析成两个不同的执行计划:

1.2.7 隐藏分区

IceBerg分区信息可以隐藏起来,可以不是表字段和表的存储目录也没关系。

IceBerg的分区信息和表数据存储目录是独立的,使得IceBerg的表分区可以被修改,而且不会涉及到数据迁移。

1.2.8 镜像数据查询(时间旅行 Time Travel)

查询表历史某一时间点的数据镜像的能力。可以将最新的sql逻辑应用到历史逻辑上。

1.2.9 支持事务ACID

1.2.10 支持乐观锁的并发支持

1.2.11 文件级数据剪裁

1.3 与其他数据湖对比

2 存储结构

存储结构如下:

2.1 数据文件data files

数据文件是Apache Iceberg表真实存储数据的文件,一般是在表的数据存储目录的data目录下,如果我们的文件格式选择的是parquet,那么文件是以“.parquet”结尾。例如:00000-0-atguigu_20230203160458_22ee74c9-643f-4b27-8fc1-9cbd5f64dad4-job_1675409881387_0007-00001.parquet就是一个数据文件。Iceberg每次更新会产生多个数据文件(data files)。

2.2 表快照 snapshot

快照代表一张表在某个时刻的状态。

每个快照里面会列出表在某个时刻的所有datafiles列表。data files是存储在不同的manifest files里面,manifest files是存储在一个Manifestlist文件里面,而一个Manifest list文件代表一个快照。

2.3清单列表Manifest list

manifest list是一个元数据文件,它列出构建表快照(Snapshot)的清单(Manifest file)。这个元数据文件中存储的是Manifest file列表,每个Manifest file占据一行。每行中存储了Manifest file的路径、其存储的数据文件(data files)的分区范围,增加了几个数文件、删除了几个数据文件等信息,这些信息可以用来在查询时提供过滤,加快速度。例如:snap-6746266566064388720-1-52f2f477-2585-4e69-be42-bbad9a46ed17.avro就是一个Manifest List文件。

2.4清单文件Manifest file

Manifest file也是一个元数据文件,它列出组成快照(snapshot)的数据文件(data files)的列表信息。每行都是每个数据文件的详细描述,包括数据文件的状态、文件路径、分区信息、列级别的统计信息(比如每列的最大最小值、空值数等)、文件的大小以及文件里面数据行数等信息。其中列级别的统计信息可以在扫描表数据时过滤掉不必要的文件。Manifest file是以avro格式进行存储的,以“.avro”后缀结尾,例如:52f2f477-2585-4e69-be42-bbad9a46ed17-m0.avro。

3 与Hive集成