离线数仓 ETL:Spark、Hive、Iceberg 如何协作

离线数仓通常用 Spark 执行 ETL,用 Hive Metastore 管理元数据,用 Iceberg 等表格式支持快照、Schema 演进和多引擎访问。

离线数仓 ETL:Spark、Hive、Iceberg 如何协作

离线数仓的核心任务是把原始数据加工成可复用的数据层。常见分层包括 ODS、DWD、DWS、ADS。

Spark、Hive、Iceberg 经常一起出现:Spark 负责计算,Hive Metastore 管理元数据,Iceberg 管理湖仓表。

Rendering diagram...

数仓分层

ODS 保存原始数据,尽量少加工。

DWD 清洗成明细事实表,字段标准化。

DWS 按主题汇总,比如用户主题、订单主题、商品主题。

ADS 面向具体应用,比如报表、看板、推荐特征。

Spark ETL

orders = spark.read.table("ods.orders")
clean_orders = orders.filter("status is not null")
clean_orders.writeTo("dwd.orders_detail").append()

Spark 适合这种大批量清洗和转换。

Hive Metastore

Hive Metastore 提供表、库、分区、Schema 的元数据管理。Spark、Trino、Flink 都可以通过 Catalog 访问这些表。

Iceberg

Iceberg 提供表格式能力,包括快照、Schema 演进、分区演进、隐藏分区、多引擎访问。

CREATE TABLE prod.db.orders (
  order_id BIGINT,
  user_id BIGINT,
  amount DECIMAL(12, 2),
  order_date DATE
) USING iceberg
PARTITIONED BY (days(order_date));

小结

离线数仓不是一个引擎能解决所有问题。Spark 负责计算,Catalog 负责元数据,Iceberg 负责表格式和快照,多引擎共同访问同一份数据。

参考链接