数据湖技术选型参考_spark

Hudi

Apache Hudi 核心特性

  • 使用快速、可插入索引进行更新、删除
  • 增量查询、记录级变更流
  • 事务、回滚、并发控制
  • 来自 Spark、Presto、Trino、Hive 等的 SQL 读/写
  • 自动文件大小调整、数据聚类、压缩、清理
  • 流摄取、内置 CDC 源和工具
  • 用于可扩展存储访问的内置元数据跟踪
  • 向后兼容的模式演变和执行

cow表

数据湖技术选型参考_hive_02

mor表

数据湖技术选型参考_apache_03

hudi 2022规划

发布

时间

​0.11.0​

2022 年 2 月

​0.12.0​

2022 年 4 月

​1.0.0​

2022 年夏季

数据湖技术选型参考_hive_04

Iceberg

Apache Iceberg 核心特性

  • 通用化标准设计
  • 完美解耦计算引擎
  • Schema 标准化
  • 开放的数据格式
  • 支持 Java 和 Python
  • 完善的 Table 语义
  • Schema 定义与变更
  • 灵活的 Partition 策略
  • ACID 语义
  • Snapshot 语义
  • 丰富的数据管理
  • 存储的流批统一
  • 可扩展的 META 设计支持
  • 批更新和 CDC
  • 支持文件加密
  • 性价比
  • 计算下推设计
  • 低成本的元数据管理
  • 向量化计算
  • 轻量级索引

Iceberg写数据

数据湖技术选型参考_apache_05

数据湖技术选型参考_spark_06

上图为 Iceberg 的写入跟读取的大致流程。

可以看到这里面分三层:

  • 最上面黄色的是快照;
  • 中间蓝色的是 Manifest;
  • 最下面是文件。

每次写入都会产生一批文件,一个或多个 Manifest,还有快照。

比如第一次形成了快照 Snap-0,第二次形成快照 Snap-1,以此类推。但是在维护原数据的时候,都是增量一步一步做追加维护的。

这样的话可以帮助用户在一个统一的存储上做批量的数据分析,也可以基于存储之上去做快照之间的增量分析,这也是 Iceberg 在流跟批的读写上能够做到一些支持的原因。

iceberg 2022规划

数据湖技术选型参考_hive_07

github现状20220118采集

fork

start

近一年发布版本次数

当前最新版本

Apacheiceberg

0.9k

2.3k

2

0.12.1

Apachehudi

1.2k

2.7k

4

0.10.0

delta-io/delta

0.9k

4k

3

1.1.0

对比环境

名称

版本

描述

flink

1.13.1

开源版本

cdh

6.3.2

开源版本

hive

2.1.1-cdh6.3.0

cdh6.3.0中版本

hadoop

3.0.0-cdh6.3.0

cdh6.3.0中版本

presto

2.591

开源版本

trino

360

开源版本

hudi

0.10

hudi-release-0.10.0 编译

Iceberg

0.13

master编译

版本支持


flink

spark

hive

impala

iceberg

1.12.x,1.13.x,1.14.x


4.0

hudi0.90

1.12.2

!1.X

3.4

hudi0.10

1.13.x

3.4

选型参考

功能可用

在规划中

没有规划且不可用

×

功能对比

Cetegory

Items

Sub-items

dalta/dalta

备注

ApacheIceberg0.13

备注

ApacheHudi0.10

备注

Basic

ACID

TimeTravel

where查询或者通过参数控制

Trino可以回滚时间点

SchemaEvolution

api支持

×

sql未支持,其他方式未知

Source/Sink

Bath

Streaming

V1支持,V2不支持

Mutation

SchemaEvolution

api支持

sql未支持,其他方式未知

PartitiomnEvolution

api支持

sql未支持,其他方式未知

Copy-on-writeUpdate

spark3.2 可以,但未合并

Merge-On-ReadUpdate

Read

×

Write

×


Compaction

×

可以手动定时合并小文件+清理过期快照

资源消耗较高,推荐手动

AdvancedFeatures

Z-Ordering

×

预计0.14

?√

0.10已经支持

E2EEncryption

×

待验证

×

SecondaryIndexes

×

×

LocalSSDcashe

×

×

×

Autosmallfilesmerge

×

×


生态对比

Cetegory

Items

Sub-items

dalta/dalta

备注

ApacheIceberg

备注

ApacheHudi

备注

Engines

ApacheSpark

Read


spark3操作icebergonhive2.1.1失败,类冲突,无法解决

Write


ApacheHive

Read


需要3.X才可以读取rt

Write


待验证

×

待验证

ApacheFlink

Read


Write


PrestoDB/Trino

Read


不支持v2读取

Write


待验证

×

待验证

Impala

Read

×

4.0支持,待验证

3.4版本支持cow读取

Write

×

×

×

Catalog

HiveCatalog


AWSGlue

×


待验证

待验证

AliyunDLF

×


待验证

×

待验证

IOVendor

AWSS3


AliyunOSS


Languages

Java/Scala


Python


Rust


×

×

优缺点汇总

类别

Hudi

Iceberg

Delte

定义

大数据UPSERT问题,目标是近实时场景,和流计算结合较好

专注解决log数据的对象存储效率问题,目标是替换云上hive

基于spark生态延伸

架构方面

hudi架构方面做的不太好,和其他引擎结合需重构代码

iceberg架构抽象比较高,和其他引擎结耦简单

upsert

读取或者压缩时,取最新的一条

先delete再insert,因此会有大量的delete file文件,然后读取时进行merge

iceberg Row-level deletes的读实现是data file基于delete file在内存进行filter,看实现需要把delete file的记录都加载到内存,那如果delete的记录比较多的情况下,应该是会引起OOM

小文件

可以设置策略在线进行小文件合并,但在线消耗资源较高

定时触发离线任务合并小文件+清理过期快照

参考点

  • 对 Append 的支持Iceberg 设计之初的主要支持方案,针对该场景做了很多优化。 Hudi 在 0.9 版本中对 Appned 模式进行了支持,目前在大部分场景下和 Iceberg 的差距不大, 目前的 0.10 版本中仍然在持续优化,与 Iceberg 的性能已经非常相近了。
  • 对 Upsert 的支持Hudi 设计之初的主要支持方案,相对于 Iceberg 的设计,性能和文件数量上有非常明显的优 势,并且 Compaction 流程和逻辑全部都是高度抽象的接口。 Iceberg 对于 Upsert 的支持启动较晚,社区方案在性能、小文件等地方与 Hudi 还有比较明显 的差距。
  • 社区活跃度Hudi 的社区相较于 Iceberg 社区明显更加活跃,得益于社区活跃,Hudi 对于功能的丰富程度与 Iceberg 拉开了一定的差距。