数据湖是什么?
数据湖(Data Lake)是一个存储企业的各种各样原始数据的大型仓库,其中的数据可供存取、处理、分析及传输。数据湖是以其自然格式存储的数据的系统或存储库,通常是对象blob或文件。数据湖通常是企业所有数据的单一存储,包括源系统数据的原始副本,以及用于报告、可视化、分析和机器学习等任务的转换数据。数据湖可以包括来自关系数据库(行和列)的结构化数据,半结构化数据(CSV,日志,XML,JSON),非结构化数据(电子邮件,文档,PDF)和二进制数据(图像,音频,视频)。
注意:数据湖是一个概念,而Hadoop是用于实现这个概念的技术,不能混为一谈。
与数据仓库的区别
- 在储存方面上,数据湖中数据为非结构化的,所有数据都保持原始形式。存储所有数据,并且仅在分析时再进行转换。数据仓库就是数据通常从事务系统中提取。
- 在将数据加载到数据仓库之前,会对数据进行清理与转换。在数据抓取中数据湖就是捕获半结构化和非结构化数据。而数据仓库则是捕获结构化数据并将其按模式组织。
- 数据湖的目的就是数据湖非常适合深入分析的非结构化数据。数据科学家可能会用具有预测建模和统计分析等功能的高级分析工具。而数据仓库就是数据仓库非常适用于月度报告等操作用途,因为它具有高度结构化。
- 在架构中数据湖通常,在存储数据之后定义架构。使用较少的初始工作并提供更大的灵活性。在数据仓库中存储数据之前定义架构。
总的来说,数据湖更像是数据仓库的原始数据层。而数据仓库从数据湖中抽取数据加工处理后,通过维度或者是范式建模等方式规范化数据湖里的数据。
数据湖的数据特点
- 数据种类多,有关系数据库(行和列)的结构化数据,半结构化数据(CSV,日志,XML,JSON),非结构化数据(电子邮件,文档,PDF)和二进制数据(图像,音频,视频)。
- 数据比较原始,可以是实时数据,也可以是非实时数据。
流行的数据湖架构
其实这个是重点,现在很流行的基于分布式文件系统构建的三个数据湖系统:Delta Lake、Hudi、Iceberg。
这三个开源项目本质上解决的痛点是:
- 都是为数据湖的数据存储层设计的;
- 都是赋予大数据圈里最流行的 Spark 计算引擎以 ACID 能力的数据存储层;
- 同时支持批处理和流处理的写入;
- 都采用了 meta 文件去管理数据,meta 文件的角色类似于数据库的 catalog/wal,起到 schema 管理、事务管理和数据管理的功能;
- 都采用了 schema 的概念去强制结构化数据,以避免低质量数据;
- 都不依赖于底层存储系统,可以选择 S3 或者是 HDFS 皆可。
这几点里最核心的概念应该支持流处理的写入。以往由于批处理和流处理的不同数据处理的特点,导致了批处理和流处理会选择不同的存储引擎去存储数据。而 HDFS 囿于本身架构设计的原因对小文件的问题一直都没解决。Delta Lake、Hudi、Iceberg 都在往这个方向迈出了一大步。
Delta Lake、Hudi、Iceberg 的比较
关于 Delta Lake、Hudi、Iceberg 的,网上的文章比较多,感兴趣的可以参考文末的链接。在这里简单地评论一下这三者。
诞生初衷
- Hudi 为了 incremental 的 upserts;
- Iceberg 定位于高性能的分析与可靠的数据管理;
- Delta Lake 定位于流批一体的数据处理。
一句话评价
- Delta Lake 发展势头最好;
- Iceberg 的设计最为优秀;
- Hudi 的性能最好。
我所关注的特性
- 关于数据更新:Delta Lake、Hudi、Iceberg 都支持 Upserts、Deletes 和 Incremental 数据,Hudi 选择了使用主键 布隆过滤器的方式,而 Delta Lake、Iceberg 因为没有主键,导致数据更新只能采用 join 的方式,性能会有极大的损失,且极度依赖于计算引擎。
- 关于计算引擎:目前 Delta Lake 支持 Apache Spark、Presto、Athena、Redshift、Snowflake 和 Hive;Hudi 支持 Hive、Presto 和 Impala;Iceberg 支持 Spark 和 Presto。
与其它存储引擎的比较
- Kudu:相比于 Kudu 自成体系的存储系统需要特定的硬件支持,Delta Lake、Hudi、Iceberg 都依赖于 HDFS 或者 S3 这样的云存储,在价格上会更占优势点;Kudu 更依赖于 Impala,而没有选择兼容其它的计算引擎,Delta Lake、Hudi、Iceberg 则更加积极地拥抱各式各样的计算引擎;另外,从架构设计上来说,Kudu 因为采用了全新的架构,避免了 HDFS 等分布式文件系统的设计缺陷,性能和可靠性相较于 Delta Lake、Hudi、Iceberg 会更好一点。
- TiSpark TiFlash:相比于 Delta Lake、Hudi、Iceberg ,这个更有前景。可能唯一的不算缺点的缺点就是计算引擎支持的太少,与 Hadoop 生态圈很难整合进去。
结论
Delta Lake、Hudi、Iceberg 在某种程度上都解决了在分布式文件系统上实现流处理更新的问题,通过使用 meta 文件管理数据和后台进程合并文件的操作,尽可能地解决了像 HDFS 这样的分布式文件系统普遍存在的小文件的问题。至于未来,能否战胜 Kudu 、TiSpark 这样的对手还是要画一个问号的。
参考链接
- https://mp.weixin.qq.com/s?__biz=MzIwNDI0ODY1OA==&mid=2655930670&idx=2&sn=a28ad8a40aac097990328e9bd3cae756&scene=21#wechat_redirect
- https://databricks.com/session_na20/a-thorough-comparison-of-delta-lake-iceberg-and-hudi
- https://developer.aliyun.com/article/744920
- https://medium.com/@eric.sun_39815/rescue-to-distributed-file-system-2dd8abd5d80d
- https://www.infoq.cn/article/FjeBCoNxD2Sz9WLoykFo
- https://iceberg.apache.org/
- https://hudi.apache.org/
- https://delta.io/