Iceberg是一种开放的数据湖表格式。您可以借助Iceberg快速地在HDFS或者阿里云OSS上构建自己的数据湖存储服务,并借助开源大数据生态的Spark、Flink、Hive和Presto等计算引擎来实现数据湖的分析。
核心能力
Apache Iceberg设计初衷是为了解决Hive数仓上云的问题,经过多年迭代已经发展成为云上构建数据湖服务的表格式标准。关于Apache Iceberg的更多介绍,请参见Apache Iceberg官网。
目前Iceberg提供以下核心能力:
基于HDFS或者对象存储构建低成本的轻量级数据湖存储服务。
实现主流开源计算引擎入湖和分析场景的完善对接。
完善的ACID语义。
支持行级数据变更能力。
支持历史版本回溯。
支持高效的数据过滤。
支持Schema变更。
支持分区布局变更。
支持隐式分区(Hidden Partitioning)。
为了便于理解数仓和Iceberg数据湖在系统架构、业务价值和成本方面的差异,选择了业界流行的Clickhouse实时数仓、Hive离线数仓和Iceberg数据湖三种具体的技术架构,为您进行了对比,详细信息如下表。
对比项 | 子项目 | 开源Clickhouse实时数仓 | 开源Hive离线数仓 | 阿里云Iceberg数据湖 |
系统架构 | 架构 | 计算存储一体 | 计算存储分离 | 计算存储分离 |
多计算引擎支持 | 不支持 | 支持 | 支持 | |
数据存储在对象存储 | 不支持 | 支持不完善 | 支持 | |
数据存储在HDFS | 不支持 | 支持 | 支持 | |
存储格式开放性 | 不开放 | 开放 | 开放 | |
业务价值 | 时效性 | 秒级 | 小时级/天级 | 分钟级 |
计算灵活性 | 低 | 强 | 强 | |
事务性 | 不支持 | 不完善 | 支持 | |
表级语义通用性 | 差 | 差 | 优秀 | |
行级数据变更 | 不支持 | 支持较弱 | 支持 | |
数据质量 | 非常高 | 较高 | 较高 | |
维护成本 | 查询性能 | 高 | 较高 | 较高 |
存储成本 | 非常高 | 一般 | 低 | |
自助服务 | 不支持 | 不支持 | 支持 | |
资源弹性 | 一般 | 一般 | 优秀 |
与开源Iceberg对比
从基础功能、数据变更和计算引擎等方面,对比了阿里云Iceberg与开源Iceberg,详细信息如下表。
“√”表示支持,“x”表示暂未支持。
类别 | 项目 | 子项目 | 开源Iceberg | Iceberg商业版(阿里云) |
基础功能 | ACID | 无 | √ | √ |
历史版本回溯 | 无 | √ | √ | |
Source和Sink集成 | Batch | √ | √ | |
Streaming | √ | √ | ||
高效数据过滤 | 无 | √ | √ | |
数据变更 | Schema Evolution | 无 | √ | √ |
Partition Evolution | 无 | √ | √ | |
CopyOnWrite更新 | 无 | √ | √ | |
MergeOnRead更新 | Read | √ | √ | |
Write | √ | √ | ||
Compaction | x | x | ||
计算引擎 | Apache Spark | 读取 | √ | √ |
写入 | √ | √ | ||
Apache Hive | 读取 | √ | √ | |
写入 | √ | √ | ||
Apache Flink | 读取 | √ | √ | |
写入 | √ | √ | ||
PrestoDB或Trino | 读取 | √ | √ | |
写入 | √ | √ | ||
编程语言 | Java | 无 | √ | √ |
Python | 无 | √ | √ | |
高级功能 | 原生接入阿里云OSS | 无 | x | √ |
原生接入阿里云DLF | 无 | x | √ | |
本地数据缓存加速 | 无 | x | √ | |
自动合并小文件 | 无 | x | √ |
以上信息是在2021年9月份,客观分析开源Iceberg和商业版Iceberg现状之后制定的表格。随着后续版本的不断迭代升级,对比项状态可能发生变化。
适用场景
Iceberg作为通用数据湖解决方案中最核心的组件之一,主要适用于以下场景。
场景 | 描述 |
实时数据导入和查询 | 数据实时从上游流入Iceberg数据湖,查询侧即可查询该数据。例如,在日志场景中,启动Iceberg或Spark流作业,实时地将日志数据导入Iceberg表中,然后可以使用Hive、Spark、Iceberg或Presto进行实时查询。同时,由于Iceberg支持ACID,保证了数据的流入和查询的隔离性,不会产生脏数据。 |
删除或更新数据 | 大部分数仓都难以实现较为高效的行级数据删除或更新,通常需要启动离线作业把整个表原始数据读取出来,然后变更数据后,写入到一个原始表。而Iceberg成功把变更的范围从表级别缩小到了文件级别,从而可以通过局部变更来完成业务逻辑的数据变更或删除。 在Iceberg数据湖中,您可以直接通过执行类似命令 |
数据质量控制 | 借助于Iceberg Schema的校验功能,在数据导入时剔除异常数据,或者对异常数据做进一步处理。 |
数据Schema变更 | 数据的Schema并非固定不变,Iceberg支持通过Spark SQL的DDL语句完成表结构变更。 Iceberg在变更表结构的时候,历史数据并不需要全部重新按照新的Schema导出一份,从而使得Schema变更的速度非常快。同时,由于Iceberg支持ACID,有效地隔离了Schema变更对现有读取任务的影响,从而使得您可以读取到结果一致的数据。 |
实时机器学习 | 通常在机器学习场景中,需要花费大量的时间处理数据,例如,数据清洗、转换和提取特征等,还需要对历史数据和实时数据进行处理。而Iceberg简化了工作流程,整个数据处理过程是一条完整的、可靠的实时流,其数据的清洗、转换和特征化等操作都是流上的节点动作,无需处理历史数据和实时数据。此外,Iceberg还支持原生的Python SDK,对于机器学习算法的开发者非常友好。 |