You need to enable JavaScript to run this app.
导航
使用说明
最近更新时间:2022.09.22 16:55:45首次发布时间:2022.04.28 13:01:14

Apache Iceberg 是一种开源的数据湖表格式,可提供对大型表快速查询、原子提交、并发写入和 Schema 变更的能力。

1 核心能力

目前 Iceberg 提供的核心能力如下:

核心能力说明
多种开源计算引擎支持Apache Hive、Apache Spark、Apache Flink、Trino等主流开源计算引擎都跟Apache Iceberg有优秀的读写能力集成。

近实时的数据变更能力

Apache Iceberg 在 format v1中提供了 Copy On Write 的数据变更能力;在 format v2中提供了 Merge On Read 的行级数据变更能力。
这种灵活的数据变更能力,很好地解决了传统离线数仓无法细粒度更新数据的痛点。

支持 ACID 语义Apache Iceberg基于乐观锁机制提供了完整的事务语义,保证了DDL和DML操作的原子性,解决了传统Hive离线数仓可能出现的脏写数据,从而影响线上分析任务的痛点问题。

隐式分区(Hidden Partitioning)

在Apache Iceberg中分区信息可以被隐藏起来,Iceberg的分区字段可以通过一个字段计算出来(分区策略可参考Partiton Transforms),在建表或者修改分区策略之后,新的数据会自动计算所属于的分区,在查询的时候同样不用关心表的分区是什么字段,只需要关注业务逻辑,Iceberg会自动过滤不需要的分区数据。Hive也支持分区,但是需要在SQL查询语句中需指定分区过滤条件,才可以加速查询。
另外Iceberg的分区信息和表数据存储目录是独立的,也使得Iceberg的表分区可以被修改,而且不会涉及到数据迁移。

Schema 变更(Schema Evolution)Apache Iceberg支持新增列、删除列、列名重命名、更新列属性、调整列顺序等,只需更改元数据,无需更改数据文件,极大减小重写数据的昂贵成本。也可以解决Hive中对列重命名导致数据准确性的问题。
访问任意历史版本及版本回滚(Time Travel and Rollback)Apache Iceberg采用快照记录表每一次的操作,根据快照可以查询历史数据。也同时提供版本回滚功能,方便对数据的跟踪和恢复。
数据压缩(Data Compaction)Apache Iceberg提供了多种重写策略比如sorting,实现数据重分布,提高数据查询性能。

2 使用场景

Apache Iceberg 作为一种开源的数据湖表格式,主要有以下几种适用场景:

2.1 传统离线数仓搬迁上云

在线下部署离线数仓时,Hive是理想的选择。但如果用户想把Hive数仓迁移上云端对象存储时,会碰到以下一系列的技术问题:

  • Rename文件耗时过长

  • Rename原子性语义无法保证

  • 文件列表list rpc耗时过长等等。

而最近几年新起的 Apache Iceberg 很好地解决了Hive表面临的这些问题。此外,它还提供了比Hive更丰富的表级语义,是非常适合用户在云端对象存储之上构建离线数仓的。

2.2 近实时数据导入和分析

数据实时从上游流入Iceberg数据湖,查询侧即可查询该数据。
例如,在日志场景中,启动 Flink 或 Spark 流作业,实时地将日志数据导入 Iceberg 表中,然后可以使用 Hive、Spark、Flink 或 Presto 进行实时查询。同时,由于 Iceberg 支持 ACID,保证了数据的流入和查询的隔离性,不会产生脏数据。

2.3 高效地分析RDBMS的CDC数据

较为实时地高效分析 CDC 数据,是大数据系统里面的老大难问题。
Apache Kudu 是开源大数据系统中少有的候选,但是 Kudu 的使用和运维较为复杂,且跟 Apache Hadoop 的生态较为割裂。对很多用户来说,做近实时地分析 CDC 数据就已经足够,Apache Kudu 提供的纯实时解决方案过于复杂。而 Apache Iceberg 很好地通过 Copy on Write 及 Merge On Read 两种实现方式,提供了分析 CDC 数据的近实时解决方案。

2.4 实时机器学习

通常在机器学习场景中,需要花费大量的时间处理数据,例如,数据清洗、转换和提取特征等,还需要对历史数据和实时数据进行处理。而 Iceberg 简化了工作流程,整条数据处理过程是一条完整的、可靠的实时流,其数据的清洗、转换和特征化等操作都是流上的节点动作,无需处理历史数据和实时数据。此外,Iceberg 还支持原生的 Python SDK,对于机器学习算法的开发者非常友好。