数据湖Iceberg

浩客7个月前技术文章440

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

相关文章

MySQL优化器特性(二)MRR优化

MySQL优化器特性(二)MRR优化

Index Range Scan索引范围扫描的一般步骤:1、根据where条件,从B+树定位到第一条记录。2、从索引页子节点中获取到行号(rowid),根据rowid回表查询数据。3、使用额外的whe...

Ranger-hase插件部署

Ranger-hase插件部署

解压插件tar -zxf  ranger-2.3.0-hbase-plugin.tar.gz -C /opt修改配置vi install.properties 内容如下:POLICY_MGR_URL=...

数据湖技术之iceberg(六)Iceberg表数据组织与查询

数据湖技术之iceberg(六)Iceberg表数据组织与查询

1     Iceberg表数据组织与查询1) 下载avro-tools jar包由于后期需要查看avro文件内容,我们可以通过avro-tool.jar来查看...

shell编程基础(一)

shell编程基础(一)

1.1 为什么学ShellShell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格...

xtrabackup报错记录

xtrabackup报错记录

报错记录报错一:报错显示需要依赖,但是当我们执行 yum install -y libstdc++ 显示已是最新版本,且通过 yum 安装 一般会将依赖包都直接安装成功。这时候可以核实一下安装包和当前...

Trino资源组配置

Trino资源组配置

1 概述Presto作为一个大数据场景下的交互式查询引擎,当使用达到一定规模,就会更多考虑资源分配问题,即保障重要任务优先获取资源。Presto资源组: Presto的资源组机制,是从资源分配的角度...

发表评论    

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