今天跟大家分享的大数据产品叫Apache Hudi,Hudi是Hadoop Updates and Incrementals的简写,它是由Uber开发并开源的Data Lakes解决方案。下面首先放一张Hudi在Hadoop体系架构中的位置图:
1. 什么是数据湖?
首先介绍一下什么是数据湖,提到数据湖,不得不说一下数据仓库。
- 关系型数据库大行其道的年代,随着各个业务系统增多,在应对一些分析场景时,慢慢产生了数据仓库的概念,包括之前介绍的Greenplum、Teradata等产品,都是数据仓库的代表产品,数据仓库最显著的特点有:ETL - 它自己不产生数据,所以需要ETL操作;历史性 - 存储一切可追溯的历史信息;分析性 - 分析能力强。
- 但是数据仓库只能落库处理结构化数据,随着数据量的增大和计算需求的复杂,很多场景是数据仓库不能解决的(当然我认为并没有♂️),所以就产生了数据湖的概念,数据湖相对于数据仓库更加平面化,不需要提前定义好schema信息。
- 数据湖和数据仓库的概念大概如上,其实我认为二者之间并不是谁替代谁的问题;在ad-hoc场景下,数据仓库仍然具有明显优势;反观分结构化场景如机器学习,超大规模数据分析等场景下,数据湖可能更有优势一些。
2. Hudi是什么?
开篇已经介绍了Hudi的基本概念,但是很多人如果第一次看,仍然不知道Hudi是什么?Hadoop体系太庞大了啊,平时道听途说张口就来的产品多了:Spark、Flink、Presto、Iceberg、Hive、Kafka。那么Hudi应该处在什么位置?看下图:
不错,仍然是第一张图,不同的是,我在图上用绿色框标注了一些产品。我们可以粗浅的认为:
- Hive、Impala、Presto、Spark等,架设在Hudi上方;
- Kafka或关系型数据库是Hudi的数据源头;
- Hudi的底层数据,实际上存储在HDFS、S3、ALLUXIO、Ali OBS等分布式存储上。
- 虽然涂上你能看到Hudi虚线框部分,也有Spark和Flink的标志,但是我们暂时忽略(因为他们仅仅是用来数据入库)
经过上面的比较,可以获知,Hudi实际上就是一个中间数据处理层。它的底层一定是要依赖分布式存储的,当然用的最多的就是HDFS。
Hudi作为一个数据湖方案,他自己本身不产生任何业务数据,可以通过Spark、Flink等工具,接入关系型数据库、日志、消息队列的数据,进行大容量的存储,最终提供给上层查询引擎比如Presto、Hive等进行查询。
3. 为什么需要Hudi?
这个也是我比较疑惑的地方,Hadoop的技术栈太复杂了啊,为什么我还要用Hudi?我想一个产品的应用和发展肯定是与他的特性分不开的,Hudi具有以下显著的特性:
- Hudi能够摄入(Ingest)和管理(Manage)基于HDFS之上的大型分析数据集,主要目的是高效的减少入库延时。
- Hudi基于Spark来对HDFS上的数据进行更新、插入、删除等。
- Hudi在HDFS数据集上提供如下流原语:插入更新(如何改变数据集);增量拉取(如何获取变更的数据)。
- Hudi可以对HDFS上的parquet格式数据进行插入/更新操作。
- Hudi通过自定义InputFormat与Hadoop生态系统(Spark、Hive、Parquet)集成。
- Hudi通过Savepoint来实现数据恢复。
- 目前,Hudi支持Spark和Flink构建一体化数据湖解决方案。
其实说到“为什么需要Hudi?”我也没有真正弄明白,你们呢?如果有什么想法,请留言交流,大家一起把这个搞搞清楚。