1. 引入
Apache Hudi是一个开源的增量数据处理框架,提供了行级insert、update、upsert、delete的细粒度处理能力(Upsert
表示如果数据集中存在记录就更新;否则插入)。
Hudi处理数据插入和更新,不会创建太多的小文件(小文件会导致查询端性能降低),Apache Hudi自动管理及合并小文件,让其保持指定大小,这避免了自建解决方案来监控和重写小文件为大文件。
Hudi数据集在如下场景下非常适用
- 使用GDPR和CCPA法规来删除用户个人信息或修改个人信息用途。
- 处理传感器或IoT设备的流式数据,涉及数据插入和更新。
- 实现CDC系统
Hudi使用开放的数据格式管理S3的数据集。现在Athena可以查询Hudi数据集,但暂还不支持写入,Athena使用Apache Hudi 0.5.2-incubating版本,0.5.2-incubating版本信息可参考这里
2. Hudi数据集类型
Hudi数据集有如下类型
- Copy on Write (CoW) – 使用Parquet列式存储,每次更新将会创建一个新版本。
- Merge on Read (MoR) – 使用Parquet列式 + Avro行式存储,更新将会写入
delta
日志文件,后面将会和Parquet列式文件进行压缩生成新版本列式文件。
对于CoW数据集,对记录更新时,包含记录的文件将会被重写;对于MoR数据集,对记录更新时,Hudi仅仅只会写更新的值。因此MoR更适合重写的场景,CoW更适合重读场景(数据很少变更)。
Hudi提供了三种逻辑视图来访问数据:
- Read-optimized 视图 – 提供CoW表最新提交的数据集和MoR表最新压缩的数据集,均读取Parquet文件。
- Incremental 视图 – 提供CoW表中两次提交的变更流,便于下游ETL作业。
- Real-time 视图 – 提供MoR表最新提交的数据,在查询时合并列式和行式文件。
现在Athena只支持Read-optimized视图,这提供了更好的查询性能但未包含最新的delta提交。关于数据集类型做的tradeoff,可以参考Hudi文档Storage Types & Views 。
3. 考虑及限制
- Athena对Hudi数据集仅支持查询Read-optimized视图
- 对于CoW类型,Athena支持快照查询;
- 对于MoR类型,Athena支持读优化查询;
- Athena对Hudi数据集不支持CTAS 或 INSERT INTO,更多关于如何写入Hudi数据集,可参考
- Amazon EMR 发布指南中玩转Hudi数据集
- Apache Hudi文档:写Hudi表
- Athena对Hudi表不支持使用
MSCK REPAIR TABLE
。如果需要加载非Glue创建的Hudi表,请使用ALTER TABLE ADD PARTITION
4. 创建Hudi表
本部分将提供Athena中创建分区和非分区Hudi表的建表示例。
如果已经在AWS Glue中创建了Hudi表,那么可以直接使用Athena查询。如果在Athena中创建Hudi表,在查询之前必须运行ALTER TABLE ADD PARTITION
来加载数据。
4.1 Copy on Write (CoW)建表示例
4.1.1 非分区CoW表
下面