Iceberg - 打造新一代数据湖技术

| 导语 新型数据湖框架是在大数据技术经历了10余年的沉淀之后,又一项业界炙手可热的技术。当前,业界涌现了一批优秀的开源框架,例如:Iceberg, Hudi, Delta Lake等。该技术可以解决大数据领域长期的流批作业混合(lambda架构)的业务痛点,包括:上游数据导入与下游分析作业的schema规范与对齐,数据写入的ACID保证,数据变更(Update, Delete等)操作,以及频繁数据导入造成的海量小文件等。TEG数据平台部的数据湖团队自2019年上半年开始密切关注与调研业界最新的热点技术,结合腾讯大数据的业务场景和特点选型Iceberg,与Netflix, Apple,Adobe等公司一起在Apache社区进行联合研发,当前已完成测试,开始业务的灰度上线。

什么是Iceberg

在这里插入图片描述

首先让我们看一下Apache 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.

Iceberg是一个通用的表格式(数据组织格式),它可以适配Presto,Spark等引擎提供高性能的读写和元数据管理功能。Iceberg的定位是在计算引擎之下存储之上。它是一种数据存储格式,Iceberg称其为"table format"。准确的说,它是介于计算引擎和数据存储格式之间的数据组织格式 - 通过特定的方式将数据和元数据组织起来,因此称之为数据组织格式更为合理,而Iceberg将其定义为表格式也直观地反映出了它的定位和功能。
在这里插入图片描述

那么这样一层中间的抽象层它有什么意义吗,能为用户带来什么样的好处呢?接下来让我们来看看Iceberg有些什么特性吧!

Iceberg特性

外部特性

ACID

ACID是现如今表格式的基本能力,Delta Lake、Hudi和Iceberg都提供了ACID能力,由ACID能力所衍生出来的row level update/delete更是这些表格式最吸引人的特性。

Iceberg提供了锁的机制来提供ACID的能力,在每次元数据更新时它会从Hive metastore中获取锁并进行更新。同时Iceberg保证了线性一致性(Serializable isolation),确保表的修改操作是原子性的,读操作永远不会读到部分或是没有commit的数据。Iceberg提供了乐观锁的机制降低锁的影响,并且使用冲突回退和重试机制来解决并发写所造成的冲突问题。

MVCC

基于ACID的能力,Iceberg提供了类似于MVCC的读写分离能力:

首先,每次写操作都会产生一个新的快照(snapshot),快照始终是往后线性递增,确保了线性一致性。而读操作只会读取已经存在了的快照,对于正在生成的快照读操作是不可见的。
每一个快照拥有表在那一时刻所有的数据和元数据,因此提供了用户回溯(time travel)表数据的能力。利用Iceberg的time travel能力,用户可以读取那一时刻的数据,同时也提供了用户快照回滚和数据重放的能力。

解耦

相比于Hudi,Delta Lake,Iceberg提供了更为完整的表格式的能力、类型的定义和操作的抽象,并与上层数据处理引擎和底层数据存储格式的解耦。

  • 对接上层,Iceberg提供了丰富的表操作接口,使得它非常容易与上层数据处理引擎对接,现已支持的包括Spark(Spark2和Spark3),Presto,Pig,正在做的是Hive和Flink的适配。其中Iceberg对于Spark的支持最好,它同时支持Spark2的Data Source V2 API和Spark3 的Data Source V2 API(包括multiple catalog支持),同时对于Spark的谓词下推能力有全面的支持。
  • 对接下层,Iceberg屏蔽了底层数据存储格式的差异,提供对于Parquet,ORC和Avro格式的支持。Iceberg起到了中间桥梁的能力,将上层引擎的能力传导到下层的存储格式。
    相比于Hudi、Delta Lake,Iceberg在设计之初并没有绑定某种特定的存储引擎,同时避免了与上层引擎之间的相互调用,使得Iceberg可以非常容易地扩展到对于不同引擎的支持。

Table Evolution

Iceberg支持in-place table evolution,用户可以像SQL那样修改表的schema,或者修改分区方式。Iceberg无需用户重写表数据或者是迁移到新表上。

Schema Evolution

Iceberg支持如下这些schema修改操作:

  • Add - 在表中或是在嵌套结构中新增column。
  • Drop - 在表中或是在嵌套结构中移除已有的column。
  • Rename - 在表中或是在嵌套结构中修改column的名字。
  • Update - 提升数据的类型,支持column,struct field,map key,map value和list中的元素。
  • Reorder - 调整表中说是嵌套结构中的column顺序。

同时Iceberg确保schema evolution是独立且没有副作用的。

Partition Evolution

Iceberg可以在已有的表上更新分区信息,因为查询语句并不直接引用分区值。同时Iceberg提供了隐式分区能力,因此用户无须利用分区信息来刻意构造一些query使得查询能够加速。相反,Iceberg可以根据用户的query来自动地进行partition pruning,从而过滤掉不需要的数据。

另外,在Iceberg中partition evolution是一个元数据操作,因此并不需要进行文件的重写。

隐式分区

既然说到了Iceberg的隐式分区功能,接下来就让我们来看一下什么是隐式分区,以及隐式分区带来的好处有哪些。

Partitioning in Hive

为了展示Hive和Iceberg在分区实现上的不同点,让我们首先来看一下这样一张表logs吧。在Hive中,分区是显式的,并且对用户呈现为column的形式,因此logs表就会有一列称为event_date。当我们向表插入数据时,我们必须提供event_date列,如下所示:

> INSERT INTO logs PARTITION (event_date)   SELECT level, message,
> event_time, format_time(event_time, 'YYYY-MM-dd')   FROM
> unstructured_log_source

同样的,当我们读取logs表的时候,在event_time这个过滤条件之外我们也必须指定event_date这样一个过滤条件来进行partition pruning。

SELECT level, count(1) as count FROM logs
  WHERE event_time BETWEEN '2018-12-01 10:00:00' AND '2018-12-01 12:00:00'
  AND event_date = '2018-12-01'

如果我们没有指定event_date这样一个过滤条件,那么Hive就会扫描全表来匹配event_time这个过滤条件。这是因为Hive并不知道event_time这一列和event_date是相关的。

这就是显式分区,这样的分区方式有什么问题呢?

Hive无法验证分区值,必须交由引擎或是用户来保证生成正确的分区值。
用户需要了解表的分区结构,从而写出更为"smart"的query。
Query与分区schema紧紧地绑定在一起,因此无法进行partition evolution。

Iceberg Hidden Partitioning

与Hive不同的是,Iceberg通过column的值来自动地计算分区值,而无需用户生成,Iceberg负责将event_time转换成event_date,并且跟踪两者的映射关系。

正因为Iceberg无须用户来维护"分区列",因此它可以隐藏分区。每次写入和读取可以正确地生成分区值并有效地进行分区过滤,用户甚至无需知道有event_date这样一列的存在。

更重要的是,由于有了隐式分区这样的功能,query不再依赖于表的物理组织方式,从而Iceberg表可以根据数据的大小及聚合程度动态地修改分区策略而无需重写表。

参考
[1] Iceberg官网 - https://iceberg.apache.org/

[2] Iceberg用户手册 - https://iwiki.oa.tencent.com/pages/viewpage.action?pageId=103352072

[3] 利用Apache Iceberg 优化大数据推荐应用 - http://km.oa.com/group/2430/articles/show/415748?kmref=search&from_page=1&no=2

[4] Apache Iceberg快速入门 - http://km.oa.com/group/2430/articles/show/414291?kmref=search&from_page=1&no=3

[5] Apache Iceberg的Schema Evolution详解 - http://km.oa.com/group/597/articles/show/414817?kmref=search&from_page=1&no=1

[6] 为什么我选择Apache Iceberg - https://mp.weixin.qq.com/s/CZYxOXmrEMjS3qn1yuni4w

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值