在工作中使用到了Iceberg作为存储底座,并基于Flink+Iceberg来构建实时数仓业务。在项目开发阶段中遇到各种各样的问题,所以写下该系列文章剖析一些关于iceberg的内部原理并记录使用iceberg过程中遇到的问题。
本文作为《Iceberg系列》文章的开篇,对数据湖技术做一个简单介绍。
数据仓库一直都是一个热门的话题,在hadoop高速发展期间,Facebook开源的Hive一直作为大数据数仓的技术技术。个人认为Hive是Hadoop时代具有划时代意义的技术,它把Hadoop大数据技术从 写MR程序 推进到了 SQL ON Hadoop 的时代,到目前为止Hive的Metastore仍然具备很重要的作用。
大数据技术发展到现在,对数仓的要求也越来越高。到目前已经从数仓演变成数据湖甚至是实时湖仓的结构,在数据实时性从T+1 发展到分钟级别,表数据更新等要求。其他关于数据仓库进化到当前的流式湖仓架构的背景本文不再阐述,相关资料互联网上比较多。
个人认为,数据湖技术的本质,是一种数据文件的组织方式,并结合一些经典的算法思想去来满足当下业务场景下对数据仓库的新要求。
目前主流数据湖技术有四个:
-
Apache Delta:spark商业化公司Delta Lake开源并主导的一个数据湖项目。基本支持主流的数据湖技术特性。虽然项目目前已经支持对接多种计算引擎如spark,trino,flink等,由于项目是Delta Lake主导的,所以和spark绑定较深。 项目地址:delta.io/
-
Apache Iceberg:奈飞公司开源的一种开放的表格式数据湖技术,设计之初就开放面向不同的存储引擎及计算引擎,Iceberg的元数据的组织结构非常清晰,同时,Iceberg项目的代码抽象层次非常分明。目前已经支持主流的计算引擎flink,spark,trino,doris,starocks等。存储支持hdfs,s3等对象存储。 项目地址: iceberg.apache.org/
-
Apache Hudi:全称 Hadoop Update Delete Incremental,它设计之初就是为了解决 Hadoop 体系内数据更新和增量查询的问题。hudi表含有主键并在写入时建立索引,可以让程序快速知道某条数据是否在一个数据文件上,进而对该文件进行更新(重写)。 项目地址: hudi.apache.org/
-
Apache Paimon: 数据湖领域的后起之秀,前身是流式处理引擎Flink的一个子项目:Flink table store,后独立孵化为apache项目,设计之初主要面向流式湖仓场景。目前支持flink,spark,trino,presto引擎,doris connector社区已经发布beta版本。apache paimon主要由国内开发者主导。 项目地址:paimon.apache.org/
以上四个主流的数据湖技术,是从不同的公司以及业务背景下孵化出来并开源的。到目前为止,这几个组件都开始往以下几个方面收敛,即使有些组件目前支持还不完美,但是都是朝着这些方向前进(如有读者知道其他的请自行补充):
- 开放的表格式,支持各种主流的存储引擎(磁盘,对象存储,hdfs......),同时不绑定具体的计算引擎,可以对接spark,flink,trino,doris等各种主流的计算引擎。
- 支持事务的ACID特性,具备对数据增删查改的能力。
- 支持快照时间旅行,保留多个快照的能力。
- 查询读取方面,支持流读和批读两种方式。支持全量读取和增量读取两种模式。流式读取时提供类似于传统数据库changelog的能力,让程序可以增量跟踪库表的变更。批量读取支持读取指定快照的数据。
- 支持主流的存储格式,如parquet,orc,avro等。
- 建立高效的索引,提升查询性能。这是一项大家都在努力的方向。
- 支持schema 变更。