本文中2021年3月创作。我2022年1月份查看官网已经更新了很多新特性(对Spark的支持和Flink的支持)。所以本篇文章参考即可。不能成为最终认定。 参考:官网,数据湖对比
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 提供 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为分区列)
四、相关机制
1.隐藏分区(Hidden partition)
Iceberg通过获取列值并可选地对其进行转换来生成分区值,并且根据数据量变化随时间推移发展分区方案。不断的根据需求维护这个分区值,加速查询速度。分区是对用户不可见的。
2、列信息收集
Iceberg使用唯一的ID来跟踪表中的每一列。添加列时,将为其分配新的ID,因此不会错误地使用现有数据。这些统计信息非常全,包括列的 size,列的 value count,null value count,以及列的最大最小值等等。这些信息都可以用来在查询时过滤数据。
数据湖 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)