返回 Skill 列表
extension
分类: 其它无需 API Key

Flink 实时数仓

Flink+Paimon+StarRocks 实时数仓全链路:CDC 入湖、物化表开发、分钟级大屏输出,一套 SQL 流批一体。

person作者: user_69009747hubcommunity

Flink 实时数仓全流程实战

概述

本 Skill 提供从零搭建 Apache Flink 实时数仓的完整方案,覆盖数据接入、分层建模、流批一体到生产调优的全链路。

适用人群:大数据工程师、数据仓库开发者、后端转大数据、面试备战

一键启动:提供完整 Docker Compose 环境,MySQL → Kafka → Flink → Paimon → StarRocks 端到端链路。


前置环境

读取 references/environment.md 获取 Docker Compose 完整配置和依赖说明。

最小硬件要求

  • CPU: 4核+
  • 内存: 16GB+
  • 磁盘: 50GB+
  • Docker & Docker Compose

操作流程

Step 1: 启动环境

cd scripts
docker-compose up -d

等待所有服务就绪(约2-3分钟),验证:

docker-compose ps  # 确认 MySQL、Kafka、Flink JobManager/TaskManager、Paimon 均 running

Step 2: Flink CDC 数据入湖(ODS层)

读取 references/flink-cdc-guide.md 获取 CDC 配置详解。

核心流程:

  1. MySQL 开启 binlog(已预配置)
  2. Flink CDC 订阅 MySQL 变更
  3. 实时写入 Paimon ODS 表

Flink SQL 示例

-- 创建 Paimon Catalog
CREATE CATALOG paimon_catalog WITH (
    'type' = 'paimon',
    'warehouse' = 'file:///tmp/paimon-warehouse'
);

USE CATALOG paimon_catalog;

-- ODS 层:MySQL 实时入湖
CREATE TABLE ods_orders (
    order_id BIGINT PRIMARY KEY NOT ENFORCED,
    user_id BIGINT,
    product_id BIGINT,
    amount DECIMAL(10,2),
    status STRING,
    create_time TIMESTAMP(3),
    update_time TIMESTAMP(3)
) WITH (
    'connector' = 'mysql-cdc',
    'hostname' = 'mysql',
    'port' = '3306',
    'username' = 'root',
    'password' = 'root',
    'database-name' = 'ecommerce',
    'table-name' = 'orders'
);

Step 3: 实时数仓分层(DWD → DWS → ADS)

读取 references/warehouse-layers.md 获取四层建模规范和 SQL 模板。

分层架构

| 层级 | 名称 | 作用 | 存储格式 | 更新频率 | |:---|:---|:---|:---|:---| | ODS | 操作数据层 | 原始数据同步 | Paimon 主键表 | 实时 | | DWD | 明细数据层 | 清洗、关联、打宽 | Paimon 主键表 | 实时 | | DWS | 汇总数据层 | 轻度聚合 | Paimon 聚合表 | 实时 | | ADS | 应用数据层 | 面向业务 | StarRocks/Doris | 实时 |

DWD 示例(订单宽表):

CREATE TABLE paimon_catalog.ecommerce.dwd_order_detail AS
SELECT 
    o.order_id,
    o.user_id,
    u.user_name,
    u.city,
    o.product_id,
    p.product_name,
    p.category,
    o.amount,
    o.status,
    o.create_time
FROM ods_orders o
LEFT JOIN ods_users FOR SYSTEM_TIME AS OF o.proc_time AS u 
    ON o.user_id = u.user_id
LEFT JOIN ods_products FOR SYSTEM_TIME AS OF o.proc_time AS p
    ON o.product_id = p.product_id;

Step 4: Flink 物化表(Materialized Table)— 流批一体声明式开发

读取 references/materialized-table.md 获取物化表完整语法。

物化表是 Flink 2.0 的核心特性,实现"一份 SQL,流批两用":

-- 创建物化表:声明数据新鲜度 + 业务逻辑
CREATE MATERIALIZED TABLE dws_hourly_sales
PARTITIONED BY (dt, hr)
FRESHNESS = INTERVAL '5' MINUTE
AS SELECT 
    DATE_FORMAT(create_time, 'yyyy-MM-dd') AS dt,
    DATE_FORMAT(create_time, 'HH') AS hr,
    category,
    COUNT(DISTINCT order_id) AS order_cnt,
    SUM(amount) AS total_amount,
    AVG(amount) AS avg_amount
FROM dwd_order_detail
GROUP BY DATE_FORMAT(create_time, 'yyyy-MM-dd'),
         DATE_FORMAT(create_time, 'HH'),
         category;

Step 5: 生产调优

读取 references/tuning-guide.md 获取完整调优清单。

关键参数

# Flink 调优
taskmanager.memory.process.size: 4096m
taskmanager.numberOfTaskSlots: 4
parallelism.default: 8
execution.checkpointing.interval: 60s
state.backend: rocksdb

# Paimon 调优
bucket: 8
changelog-producer: input
merge-engine: partial-update

常见场景速查

场景1:MySQL 数据实时同步到数据湖

→ Step 2 的 Flink CDC 流程

场景2:构建实时大屏(GMV/订单量实时展示)

→ Step 3 DWD + Step 4 物化表 + StarRocks 查询

场景3:流批一体:白天实时 + 凌晨全量回刷

→ 使用物化表修改 FRESHNESS,从 INTERVAL '5' MINUTE 切换为批模式

场景4:面试准备

→ 通读 references/interview-qa.md,覆盖 Flink 高频面试题


资源索引

| 资源 | 路径 | 用途 | |:---|:---|:---| | Docker环境 | scripts/docker-compose.yml | 一键启动全链路环境 | | Flink SQL 模板 | scripts/flink-sql-templates/ | 四层建模 SQL 模板 | | CDC配置参考 | references/flink-cdc-guide.md | CDC 配置详解与踩坑 | | 数仓分层规范 | references/warehouse-layers.md | 四层建模规范 | | 物化表语法 | references/materialized-table.md | Flink 2.0 物化表详解 | | 生产调优 | references/tuning-guide.md | 参数调优清单 | | 面试题库 | references/interview-qa.md | Flink 高频面试题及解析 | | 环境说明 | references/environment.md | 环境要求与依赖 |


注意事项

  • 首次启动 Docker 环境需拉取镜像,建议提前执行 docker-compose pull
  • Flink CDC 依赖 MySQL binlog,确保 MySQL 已开启 binlog_format=ROW
  • Paimon 本地模式适合开发测试,生产环境建议使用 HDFS/S3
  • 物化表功能需要 Flink 1.20+ 版本 (内容由AI生成,仅供参考)