iceberg的调研报告

iceberg的调研报告

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


iceberg简介

在这里插入图片描述
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中;
  • 支持事务 序列化隔离 表更改是原子性的,读者永远不会看到部分更改或未提交的更改;
  • 高并发 高并发写入器使用乐观并发,即使写入冲突,也会重试以确保兼容更新成功。

缺点:

引擎缺点
hive1、本身是不支持Upserts/Delete/Merge/Update
2、读取其他引擎建表只能映射表,且映射表只能读取,不可操作。
Spark1、不支持流读取,支持流写入
2、有namespace概念,理解和测试起来难度大。
3、各引擎之间所建的表,兼容性不好。
Flink测试中

二、 版本支持

引擎版本
hive2.X
Spark2.4(支持API极少,不建议使用)
Spark3.0(建议使用)
Flink1.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.0Iceberg 0.11.0
存储存储支持HDFS, S3 (Databricks), OSSHDFS, S3 (Databricks)
-压缩支持parquetavro,parquet
-历史回滚支持支持
-快照支持支持
-支持引擎SparkSpark、Flink
Hive建表Hive建表其他引擎无法操作。支持建立映射表Hive建表其他引擎无法操作。支持建立映射表
-查询不能直接查询Spark表,需要映射不能查询Spark\Flink的iceberg表,需要映射
-insert/delete/update/merge不支持不支持
-alter table不支持不支持
-主键不支持不支持
Spark3.0-SQL链接方式catalogcatalog(操作时需切换namespace)
-建/删表支持支持
-查询支持支持
-alter table支持支持
注意:改数据类有限制(只允许加宽类型int -> bigint。类型不可以随意转换int 不可转string)
-历史查看/回滚/删除支持查看/删除支持(需要调用自带的CALL,测试暂未通过)
-建立快照支持(操作10次自动快照),但不支持手动创建快照支持(需要调用自带的CALL,测试暂未通过),并可手动设置快照,自定义快照名称
-与其他引擎兼容只允许Hive外表查看,不允许更改只允许Hive外表查看,不允许更改
允许Flink查看及操作
-其他表运维操作少于iceberg。
Delta不支持:删除表未引用文件、使用快照建立临时表、其他表迁移至ice表等
不允许show create table
show tables 只展示ice表
Spark3.0-Streamingsource支持不支持
-sink支持(无主键)支持(无主键)
-merge sink不支持不支持
Flink1.11.0-SQL链接方式不支持Flinkcatalog
-建/删表不支持Flink支持
-查询不支持Flink支持
-insert/delete/update/merge不支持Flink仅支持insert into
-alter table不支持Flink仅支持改表名
如果需要更改表结构/类型等操作,需切换Spark引擎操作
-与其他引擎兼容不支持Flink只允许Hive外表查看,不允许更改,允许Spark查看及操作
Flink1.11.0-Streamingsource不支持Flink不支持
-sink不支持Flink支持(无主键)
-merge sink不支持Flink不支持

总结

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值