数据湖的理念:
1、能够存储海量的原始数据
结构化数据
半结构化数据
非结构化数据
二进制数据(图片等)
2、能够支持任意的数据格式
底层存储:S3、OSS、HDFS,Parquet、Avro、Orc
数据缓存加速
轻量级索引
3、有较好的分析和处理能力
多种数据源接入、数据连接、Schema管理、权限管理,
批处理、流处理、交互式分析、机器学习
=============================
Hudi特性:廉价存储、table schema、acid语义保证,多版本保证、支持流批读写
不需强绑定支持spark,python接口支持、对flink的支持没那么好
iceberg支持多种引擎但功能不完善,curd支持不够好
==================================
Apache Hudi核心概念介绍
- 有序的时间轴元数据
- 分层布局的数据文件
- 索引
hudi存储类型:
COW模式:copy on write写时复制,读写分离思想
要写,先复制一份文件出来,在复制出来的文件上增加,读还是读原文件。
MOR模式: merge on read读时合并,读之前要先进行合并。
写在parqure格式,把新来的数据写在一个log文件里,读时要把两个文件的结果合并起来
从湖里查询的三种查询:
读优化:只查询指定的commit之前限定范围的最新数据,只能看到列式格式base文件中(parquet)的最新数据
增量:数据是不断增加的,像管理git一样,有很多版本数据,有很多commit,数据版本的增量,hudi是清楚的。可以查到最新写入到hudi表里的数据。
快照:每隔一段时间,我们可手动对当前数据做快照操作,记录当前数据状态与版本。可以快速获取快照数据。使用快照时,可查到指定commit以后的最新的数据
index:索引
数据存储在底层文件系统,要快速从文件系统里找到数据文件,就需要这种索引。
data file:parquet列式存储,也支持avro行式存储
timeline metadata时间轴,
git commit增量提交,会形成新的代码版本,串起来就是一个timeline时间轴,对于数据湖的好处是可以做数据回溯,用增量的方式把数据版本管理了起来。
查询引擎:
hive、spark、presto、flink(未完善)
Update(Upsert)/Delete记录:Hudi使用细粒度的文件/记录级别索引来支持update和delete记录,同时还提供写操作的事务保证。查询会处理最后一个提交的快照来输出结果。
delete的方法是增加一条记录标记某记录要被删除;update方法是增加一条记录标记某记录要被删除,与另一条记录标记某记录要被insert。
变更流:Hudi可以从给定的时间点获取给定表中已updated、inserted、deleted的所有记录的增量流,成为一种新的查询类别。可把Hudi当kafka用。
Hudi表设计--时间
Arrival time:数据到达Hudi的时间
commit time:提交时间
Event time:record事件时间
例:Flink去统计某接口每分钟调用失败日志的个数。这时就要用Event time。
类别:到达flink时间、数据处理时间、事件时间
数据文件
如果使用大数据方案,就会存在hdfs中,
FileManage
partition分区,对应hdfs目录
数据分两类,parquet数据文件,.hoodie中存放状态文件记录
hoodie key唯一字段加分区联合当作数据唯一键。
索引
布隆过滤器:
存储格式
读优化的列存格式 ROFormat,缺省Parquet
写优化的行存格式 WOFormat,缺省Avro
Apache Hudi的特性和功能
Apache Hudi的存储格式和查询类型
基于Hudi构建企业级应用场景