Apache Iceberg 是一种开源的数据湖表格式,可提供对大型表快速查询、原子提交、并发写入和 Schema 变更的能力。
目前 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查询语句中需指定分区过滤条件,才可以加速查询。 |
Schema 变更(Schema Evolution) | Apache Iceberg支持新增列、删除列、列名重命名、更新列属性、调整列顺序等,只需更改元数据,无需更改数据文件,极大减小重写数据的昂贵成本。也可以解决Hive中对列重命名导致数据准确性的问题。 |
访问任意历史版本及版本回滚(Time Travel and Rollback) | Apache Iceberg采用快照记录表每一次的操作,根据快照可以查询历史数据。也同时提供版本回滚功能,方便对数据的跟踪和恢复。 |
数据压缩(Data Compaction) | Apache Iceberg提供了多种重写策略比如sorting,实现数据重分布,提高数据查询性能。 |
Apache Iceberg 作为一种开源的数据湖表格式,主要有以下几种适用场景:
在线下部署离线数仓时,Hive是理想的选择。但如果用户想把Hive数仓迁移上云端对象存储时,会碰到以下一系列的技术问题:
Rename文件耗时过长
Rename原子性语义无法保证
文件列表list rpc耗时过长等等。
而最近几年新起的 Apache Iceberg 很好地解决了Hive表面临的这些问题。此外,它还提供了比Hive更丰富的表级语义,是非常适合用户在云端对象存储之上构建离线数仓的。
数据实时从上游流入Iceberg数据湖,查询侧即可查询该数据。
例如,在日志场景中,启动 Flink 或 Spark 流作业,实时地将日志数据导入 Iceberg 表中,然后可以使用 Hive、Spark、Flink 或 Presto 进行实时查询。同时,由于 Iceberg 支持 ACID,保证了数据的流入和查询的隔离性,不会产生脏数据。
较为实时地高效分析 CDC 数据,是大数据系统里面的老大难问题。
Apache Kudu 是开源大数据系统中少有的候选,但是 Kudu 的使用和运维较为复杂,且跟 Apache Hadoop 的生态较为割裂。对很多用户来说,做近实时地分析 CDC 数据就已经足够,Apache Kudu 提供的纯实时解决方案过于复杂。而 Apache Iceberg 很好地通过 Copy on Write 及 Merge On Read 两种实现方式,提供了分析 CDC 数据的近实时解决方案。
通常在机器学习场景中,需要花费大量的时间处理数据,例如,数据清洗、转换和提取特征等,还需要对历史数据和实时数据进行处理。而 Iceberg 简化了工作流程,整条数据处理过程是一条完整的、可靠的实时流,其数据的清洗、转换和特征化等操作都是流上的节点动作,无需处理历史数据和实时数据。此外,Iceberg 还支持原生的 Python SDK,对于机器学习算法的开发者非常友好。