博客 数据湖Iceberg

数据湖Iceberg

   数栈君   发表于 2024-06-27 19:20  263  0

1、概述 

        Iceberg 是一个面向海量数据分析场景的开放表格式(Table Format。表格式(Table  Format)可以理解为元数据以及数据文件的一种组织方式,处于计算框架(FlinkSpark...) 之下,数据文件之上。

2、特性

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

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

2.2 实时流批一体 

         Iceberg 上游组件将数据写入完成后,下游组件及时可读,可查询。可以满足实时场景. 并且 Iceberg 同时提供了流/批读接口、流/批写接口。可以在同一个流程里, 同时处理流数据 和批数据,大大简化了 ETL 链路。

2.3 数据表演化(Table Evolution) 

         Iceberg 可以通过 SQL 的方式进行表级别模式演进。进行这些操作的时候,代价极低。不存在读出数据重新写入或者迁移数据这种费时费力的操作。 比如在常用的 Hive 中,如果我们需要把一个按天分区的表,改成按小时分区。此时, 不能再原表之上直接修改,只能新建一个按小时分区的表,然后再把数据 Insert 到新的小时 分区表。而且,即使我们通过 Rename 的命令把新表的名字改为原表,使用原表的上次层应 用, 也可能由于分区字段修改,导致需要修改 SQL,这样花费的经历是非常繁琐的。

2.4 模式演化(Schema Evolution) 

Iceberg 支持下面几种模式演化: 

  • ADD:向表或者嵌套结构增加新列 

  • Drop:从表中或者嵌套结构中移除一列 

  • Rename:重命名表中或者嵌套结构中的一列 

  • Update:将复杂结构(struct, map<key, value>, list)中的基本类型扩展类型长度, 比如 tinyint 修改成 int. 

  • Reorder:改变列或者嵌套结构中字段的排列顺序 

Iceberg 保证模式演化(Schema Evolution)是没有副作用的独立操作流程, 一个元数据操作, 不会涉及到重写数据文件的过程。具体的如下: 

  • 增加列时候,不会从另外一个列中读取已存在的的数据 

  • 删除列或者嵌套结构中字段的时候,不会改变任何其他列的值 

  • 更新列或者嵌套结构中字段的时候,不会改变任何其他列的值 

  • 改变列列或者嵌套结构中字段顺序的时候,不会改变相关联的值 

        在表中 Iceberg 使用唯一 ID 来定位每一列的信息。新增一个列的时候,会新分配给它一 个唯一 ID, 并且绝对不会使用已经被使用的 ID。 使用名称或者位置信息来定位列的, 都会存在一些问题, 比如使用名称的话,名称可能 会重复, 使用位置的话, 不能修改顺序并且废弃的字段也不能删除。

2.5 分区演化(Partition Evolution) 

         Iceberg 可以在一个已存在的表上直接修改,因为 Iceberg 的查询流程并不和分区信息直接关联。 当我们改变一个表的分区策略时,对应修改分区之前的数据不会改变, 依然会采用老的 分区策略,新的数据会采用新的分区策略,也就是说同一个表会有两种分区策略,旧数据采 用旧分区策略,新数据采用新新分区策略, 在元数据里两个分区策略相互独立,不重合。

         在查询数据的时候,如果存在跨分区策略的情况,则会解析成两个不同执行计划,如 Iceberg 官网提供图所示:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/55d1616de8f9bea35198e981858845fe..jpg

   图中 booking_table 表 2008 年按月分区,进入 2009 年后改为按天分区,这两中分区策 略共存于该表中。 借助 Iceberg 的隐藏分区(Hidden Partition),在写 SQL 查询的时候,不需要在 SQL 中 特别指定分区过滤条件,Iceberg 会自动分区,过滤掉不需要的数据。 Iceberg 分区演化操作同样是一个元数据操作, 不会重写数据文件。 

2.6 列顺序演化(Sort Order Evolution) 

         Iceberg 可以在一个已经存在的表上修改排序策略。修改了排序策略之后, 旧数据依旧采 用老排序策略不变。往 Iceberg 里写数据的计算引擎总是会选择最新的排序策略, 但是当排 序的代价极其高昂的时候, 就不进行排序了。 

2.7 隐藏分区(Hidden Partition) 

         Iceberg 的分区信息并不需要人工维护, 它可以被隐藏起来. 不同其他类似 Hive 的分区 策略, Iceberg 的分区字段/策略(通过某一个字段计算出来),可以不是表的字段和表数据存储目录也没有关系。在建表或者修改分区策略之后,新的数据会自动计算所属于的分区。在 查询的时候同样不用关系表的分区是什么字段/策略,只需要关注业务逻辑,Iceberg 会自动 过滤不需要的分区数据。 正是由于 Iceberg 的分区信息和表数据存储目录是独立的,使得 Iceberg 的表分区可以被 修改,而且不和涉及到数据迁移。

2.8 镜像数据查询(Time Travel) 

         Iceberg 提供了查询表历史某一时间点数据镜像(snapshot)的能力。通过该特性可以将 最新的 SQL 逻辑,应用到历史数据上。 

2.9 支持事务(ACID) 

        Iceberg 通过提供事务(ACID)的机制,使其具备了 upsert 的能力并且使得边写边读成 为可能,从而数据可以更快的被下游组件消费。通过事务保证了下游组件只能消费已 commit 的数据,而不会读到部分甚至未提交的数据。 

2.10 基于乐观锁的并发支持 

        Iceberg 基于乐观锁提供了多个程序并发写入的能力并且保证数据线性一致。 

2.11 文件级数据剪裁 

        Iceberg 的元数据里面提供了每个数据文件的一些统计信息,比如最大值,最小值,Count 计数等等。因此,查询 SQL 的过滤条件除了常规的分区,列过滤,甚至可以下推到文件级 别,大大加快了查询效率。


《行业指标体系白皮书》下载地址:https://www.dtstack.com/resources/1057/?src=bbs

《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001/?src=bbs

《数栈V6.0产品白皮书》下载地址:https://www.dtstack.com/resources/1004/?src=bbs

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack

0条评论
下一篇:
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群