数据湖Iceberg

浩客11个月前技术文章809

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 官网提供图所示:

111111111.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 的过滤条件除了常规的分区,列过滤,甚至可以下推到文件级 别,大大加快了查询效率。

相关文章

大数据集群部署规划(一)关于节点的定义

大数据集群部署规划(一)关于节点的定义

节点定义:CDH集群节点定义CDH 官方文档有一份更详细的节点和角色配置,官网将主机分成以下四种类型: 1) Master hosts run Hadoop master processes such...

MS SQL Server 实战 统计与汇总重复记录

MS SQL Server 实战 统计与汇总重复记录

需求在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统计结果进一步对数据进行合理化处理。比如我们有一组题库数据,主要包括题目和选项字段(如单选题目、多选题目和判断题...

Ambari Hive 创建函数无权限

Ambari Hive 创建函数无权限

1、创建udf函数参考文档:https://blog.csdn.net/helloxiaozhe/article/details/102498567如果已经编写好,请使用自己的。如果没有请参考以上链接...

切换不同的网络访问同一个业务报错"network error"

切换不同的网络访问同一个业务报错"network error"

问题现象:业务:xxx,使用谷歌浏览器登陆之后,访问“商品档案”模块,会提示“network error”报错内容,但是切换到其他浏览器测试是可以正常访问的,同时,在使用谷歌浏览器访问的情况下,如果切...

RAID磁盘阵列详解

RAID磁盘阵列详解

1 RAID原理无论是DAS、NAS还是SAN,都是存储系统,一个存储系统可以包含多块磁盘。不同磁盘之间的组织排列,就是磁盘阵列技术,也就是RAID技术。RAID磁盘阵列技术的核心思想主要有两个,包括...

CDH实操--集成 freeipa

CDH实操--集成 freeipa

1 概述环境准备: 1)安装cdh6.2.1 2)安装FreeIPA,server和client(在所有cdh节点)2 集成2.1 krb5.conf修改注释:default_ccache_nam...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。