iceberg的调研报告

本文中2021年3月创作。我2022年1月份查看官网已经更新了很多新特性(对Spark的支持和Flink的支持)。所以本篇文章参考即可。不能成为最终认定。 参考:官网,数据湖对比


iceberg简介

iceberg对比hive iceberg和glacier的区别_hadoop

Apache Iceberg is an open table format for huge analytic datasets. Iceberg adds tables to Presto and Spark that use a high-performance format that works just like a SQL table.

设计初衷是:以类似于SQL的形式高性能的处理大型的开放式表, 联想HIVE工具!其对类似hive作了优化 !


一、iceberg优势?优点

优化数据入库流程:Iceberg 提供 ACID 事务能力,上游数据写入即可见,不影响当前数据处理任务,这大大简化了 ETL;Iceberg 提供了 upsert、merge into 能力,可以极大地缩小数据入库延迟;

支持更多的分析引擎:优秀的内核抽象使之不绑定特定的计算引擎,目前 Iceberg 支持的计算引擎有 Spark、Flink、Presto 以及 Hive;

统一数据存储和灵活的文件组织:提供了基于流式的增量计算模型和基于批处理的全量表计算模型。批处理和流任务可以使用相同的存储模型,数据不再孤立;Iceberg 支持隐藏分区和分区进化,方便业务进行数据分区策略更新。支持 Parquet、Avro 以及 ORC 等存储格式;

增量读取处理能力:Iceberg 支持通过流式方式读取增量数据,支持 Structed Streaming 以及 Flink table Source。

特点

  • 模式演化支持添加,删除,更新或重命名,并且没有副作用;
  • 隐藏分区可以防止导致错误提示或非常慢查询的用户错误;
  • 分区布局演变可以随着数据量或查询模式的变化而更新表的布局;
  • 快照控制 可实现使用完全相同的表快照的可重复查询,或者使用户轻松检查更改;
  • 版本回滚使用户可以通过将表重置为良好状态来快速纠正问题;
  • 快速扫描数据 无需使用分布式SQL引擎即可读取表或查找文件;
  • 数据修剪优化 使用表元数据使用分区和列级统计信息修剪数据文件;
  • 兼容性好 ,可以存储在任意的云存储系统和HDFS中;
  • 支持事务 序列化隔离 表更改是原子性的,读者永远不会看到部分更改或未提交的更改;
  • 高并发 高并发写入器使用乐观并发,即使写入冲突,也会重试以确保兼容更新成功。

缺点:

引擎

缺点

hive

1、本身是不支持Upserts/Delete/Merge/Update

2、读取其他引擎建表只能映射表,且映射表只能读取,不可操作。

Spark

1、不支持流读取,支持流写入

2、有namespace概念,理解和测试起来难度大。

3、各引擎之间所建的表,兼容性不好。

Flink

测试中

二、 版本支持

引擎

版本

hive

2.X

Spark

2.4(支持API极少,不建议使用)

Spark

3.0(建议使用)

Flink

1.11.0

存储

支持

HDFS

支持

S3

支持

格式

支持

Parquet

支持

ORC

支持

avro

支持

三、文件结构

其中metadata目录存放元数据管理层的数据:

  • version[number].metadata.json:存储每个版本的数据更改项;
  • snap-[snapshotID]-[attemptID]-[commitUUID].avro:存储快照snapshot文件;
  • [commitUUID]-[attemptID]-[manifestCount].avro:manifest文件(元数据文件),其里面列出了组成某个快照(snapshot)的数据文件列表。每行都是每个数据文件的详细描述,包括数据文件的状态、文件路径、分区信息、列级别的统计信息(比如每列的最大最小值、空值数等)、文件的大小以及文件里面数据的行数等信息。其中列级别的统计信息在 Scan 的时候可以为算子下推提供数据,以便可以过滤掉不必要的文件。

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

iceberg对比hive iceberg和glacier的区别_hadoop_02

四、相关机制

1.隐藏分区(Hidden partition)

Iceberg通过获取列值并可选地对其进行转换来生成分区值,并且根据数据量变化随时间推移发展分区方案。不断的根据需求维护这个分区值,加速查询速度。分区是对用户不可见的。

iceberg对比hive iceberg和glacier的区别_大数据_03


2、列信息收集

Iceberg使用唯一的ID来跟踪表中的每一列。添加列时,将为其分配新的ID,因此不会错误地使用现有数据。这些统计信息非常全,包括列的 size,列的 value count,null value count,以及列的最大最小值等等。这些信息都可以用来在查询时过滤数据。

iceberg对比hive iceberg和glacier的区别_hadoop_04


数据湖 Delta对比Iceberg(对比时间2021-04)

类型

对比点

Delta Lake 0.7.0

Iceberg 0.11.0

存储

存储支持

HDFS, S3 (Databricks), OSS

HDFS, S3 (Databricks)

-

压缩支持

parquet

avro,parquet

-

历史回滚

支持

支持

-

快照

支持

支持

-

支持引擎

Spark

Spark、Flink

Hive

建表

Hive建表其他引擎无法操作。支持建立映射表

Hive建表其他引擎无法操作。支持建立映射表

-

查询

不能直接查询Spark表,需要映射

不能查询Spark\Flink的iceberg表,需要映射

-

insert/delete/update/merge

不支持

不支持

-

alter table

不支持

不支持

-

主键

不支持

不支持

Spark3.0-SQL

链接方式

catalog

catalog(操作时需切换namespace)

-

建/删表

支持

支持

-

查询

支持

支持

-

alter table

支持

支持

注意:改数据类有限制(只允许加宽类型int -> bigint。类型不可以随意转换int 不可转string)

-

历史查看/回滚/删除

支持查看/删除

支持(需要调用自带的CALL,测试暂未通过)

-

建立快照

支持(操作10次自动快照),但不支持手动创建快照

支持(需要调用自带的CALL,测试暂未通过),并可手动设置快照,自定义快照名称

-

与其他引擎兼容

只允许Hive外表查看,不允许更改

只允许Hive外表查看,不允许更改

允许Flink查看及操作

-

其他

表运维操作少于iceberg。

Delta不支持:删除表未引用文件、使用快照建立临时表、其他表迁移至ice表等

不允许show create table

show tables 只展示ice表

Spark3.0-Streaming

source

支持

不支持

-

sink

支持(无主键)

支持(无主键)

-

merge sink

不支持

不支持

Flink1.11.0-SQL

链接方式

不支持Flink

catalog

-

建/删表

不支持Flink

支持

-

查询

不支持Flink

支持

-

insert/delete/update/merge

不支持Flink

仅支持insert into

-

alter table

不支持Flink

仅支持改表名

如果需要更改表结构/类型等操作,需切换Spark引擎操作

-

与其他引擎兼容

不支持Flink

只允许Hive外表查看,不允许更改,允许Spark查看及操作

Flink1.11.0-Streaming

source

不支持Flink

不支持

-

sink

不支持Flink

支持(无主键)

-

merge sink

不支持Flink

不支持

总结

数据湖服务组件,其实大部分设计思路都是一样的。之前做过Delte Lake,再看这个就非常容易理解。 但是每个服务组件之间也是有特点的。像iceberg的特点就是难理解,不好操作。但是兼容的引擎特别多。 官网写的也是一环套一环,看官网最好是一口气看完再进行操作。否则很难理解。操作的时候也各种报错。 尤其是Spark环节。坑多摔的我鼻青脸肿的。 Flink支持度是真的高,不是一般高。基本不报错。(不像Spark)