目录
[1. 背景与目标](#1. 背景与目标)
[2. 整体架构](#2. 整体架构)
[3. 核心组件说明](#3. 核心组件说明)
[3.1 Apache Flink](#3.1 Apache Flink)
[3.2 Apache Doris(原 Palo)](#3.2 Apache Doris(原 Palo))
[3.3 Apache Airflow](#3.3 Apache Airflow)
[4. 实施步骤](#4. 实施步骤)
[实时链路(Flink CDC + Kafka)](#实时链路(Flink CDC + Kafka))
[离线链路(Airflow 调度 Flink Batch Job)](#离线链路(Airflow 调度 Flink Batch Job))
[步骤三:Flink 实时计算层](#步骤三:Flink 实时计算层)
[步骤四:Doris 表模型设计](#步骤四:Doris 表模型设计)
[表1:实时明细表(Duplicate Key 模型)](#表1:实时明细表(Duplicate Key 模型))
[表2:分钟级聚合表(Aggregate Key 模型)](#表2:分钟级聚合表(Aggregate Key 模型))
[步骤五:Airflow 统一调度](#步骤五:Airflow 统一调度)
[DAG 示例:daily_report_dag.py](#DAG 示例:daily_report_dag.py)
[5. 方案优势对比(vs DataX 方案)](#5. 方案优势对比(vs DataX 方案))
[6. 最佳实践与注意事项](#6. 最佳实践与注意事项)
[6.1 性能优化](#6.1 性能优化)
[6.2 数据一致性](#6.2 数据一致性)
[6.3 成本控制](#6.3 成本控制)
[6.4 安全合规](#6.4 安全合规)
[7. 总结](#7. 总结)
1. 背景与目标
随着业务对数据时效性要求的提升,传统 T+1 的离线报表已无法满足实时决策需求。本方案基于 Apache Flink(流批一体计算引擎) + Apache Doris(高性能 MPP 分析型数据库) + Apache Airflow(工作流调度平台),构建一套支持 实时 + 离线融合 的企业级报表统计体系,实现:
- 实时数据接入与处理(秒级延迟)
- 高并发、低延迟的即席查询能力
- 统一调度管理批处理与流处理任务
- 支撑多维分析、大屏监控、运营报表等场景
2. 整体架构
[业务系统] [日志采集] [消息队列]`
` │ │ │`
` ▼ ▼ ▼`
`┌─────────────┐ ┌──────────┐ ┌────────────┐`
`│ MySQL Binlog│ │ FileBeat │ │ Kafka/Pulsar│`
`└──────┬──────┘ └─────┬────┘ └──────┬─────┘`
` │ │ │`
` └───────────────┴──────────────┘`
` │`
` ┌─────────▼──────────┐`
` │ Apache Flink │ ←── Airflow 触发批作业`
` │ (实时计算 + 批处理) │`
` └─────────┬──────────┘`
` │`
` ┌───────────▼────────────┐`
` │ Apache Doris │`
` │ (统一存储与分析引擎) │`
` └───────────┬────────────┘`
` │`
` ┌────────────▼────────────┐`
` │ BI 工具 / 报表系统 / API│`
` │ (Superset, FineReport...)│`
` └─────────────────────────┘
3. 核心组件说明
3.1 Apache Flink
- 流批一体:同一套 API 处理实时流(Kafka)和历史批数据(HDFS/MySQL)
- 状态管理 & 容错:Exactly-once 语义保障数据一致性
- 丰富连接器:支持 Kafka、MySQL CDC、Doris、JDBC、File 等
- 窗口计算:支持滚动、滑动、会话窗口,适用于实时聚合
3.2 Apache Doris(原 Palo)
- MPP 架构:向量化执行引擎,高并发低延迟查询
- 实时写入:支持 Stream Load、Routine Load(Kafka 自动消费)、Broker Load
- 统一模型:明细模型 + 聚合模型 + 更新模型,适配不同场景
- 兼容 MySQL 协议:BI 工具可直接连接,无缝集成
3.3 Apache Airflow
- DAG 编排:可视化定义任务依赖关系
- 调度精准:基于 cron 表达式,支持 backfill
- 扩展性强:自定义 Operator(如 FlinkSubmitOperator、DorisQueryOperator)
- 监控告警:集成 Prometheus + Grafana 或邮件/钉钉通知
4. 实施步骤
步骤一:环境部署
|---------|----------|--------------------------------|
| 组件 | 版本建议 | 部署方式 |
| Flink | 1.17+ | Standalone / YARN / Kubernetes |
| Doris | 2.0+ | FE(元数据)+ BE(存储计算)集群 |
| Airflow | 2.7+ | Docker / Helm / 源码部署 |
| Kafka | 3.0+ | 用于缓冲实时数据 |
建议使用 Kubernetes + Helm 统一编排,便于扩缩容与运维。
步骤二:数据接入层设计
实时链路(Flink CDC + Kafka)
// 示例:MySQL → Kafka(通过 Flink CDC)
CREATE TABLE mysql_orders (
id BIGINT,
order_no STRING,
amount DECIMAL(10,2),
create_time TIMESTAMP(3),
proc_time AS PROCTIME()
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'mysql-host',
'port' = '3306',
'username' = 'user',
'password' = 'pwd',
'database-name' = 'order_db',
'table-name' = 'orders'
);
-- 写入 Kafka
INSERT INTO kafka_orders_topic
SELECT id, order_no, amount, create_time FROM mysql_orders;
离线链路(Airflow 调度 Flink Batch Job)
- 每日凌晨同步历史全量数据(如用户维度表)
- 使用 FlinkRunOperator 提交批作业 JAR 包
步骤三:Flink 实时计算层
场景:实时销售大屏(每分钟聚合)
-- Flink SQL 作业
CREATE TABLE doris_sales_realtime (
stat_minute STRING,
city STRING,
order_cnt BIGINT,
total_amount DECIMAL(18,2)
) WITH (
'connector' = 'doris',
'fenodes' = 'fe:8030',
'table.identifier' = 'report.sales_realtime',
'username' = 'root',
'password' = '',
'sink.label-prefix' = 'sales_'
);
INSERT INTO doris_sales_realtime
SELECT
DATE_FORMAT(TUMBLE_ROWTIME(create_time, INTERVAL '1' MINUTE), 'yyyy-MM-dd HH:mm') AS stat_minute,
user_city AS city,
COUNT(*) AS order_cnt,
SUM(amount) AS total_amount
FROM kafka_orders_with_user_info
GROUP BY TUMBLE(create_time, INTERVAL '1' MINUTE), user_city;
注:通过维表 JOIN 补充用户城市信息(使用 Temporal Join)
步骤四:Doris 表模型设计
表1:实时明细表(Duplicate Key 模型)
CREATE TABLE orders_detail (
order_id BIGINT,
order_no VARCHAR(64),
user_id BIGINT,
amount DECIMAL(10,2),
create_time DATETIME
) ENGINE=OLAP
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_time) (
START ("2025-01-01") END ("2026-01-01") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(order_id) BUCKETS 10;
表2:分钟级聚合表(Aggregate Key 模型)
CREATE TABLE sales_realtime (
stat_minute DATETIME,
city VARCHAR(32),
order_cnt BIGINT SUM,
total_amount DECIMAL(18,2) SUM
) ENGINE=OLAP
AGGREGATE KEY(stat_minute, city)
PARTITION BY RANGE(stat_minute) (...)
DISTRIBUTED BY HASH(city) BUCKETS 8;
步骤五:Airflow 统一调度
DAG 示例:daily_report_dag.py
from airflow import DAG
from airflow.providers.apache.flink.operators.flink import FlinkRunOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'data-team',
'retries': 2,
'retry_delay': timedelta(minutes=5)
}
with DAG(
'daily_sales_summary',
default_args=default_args,
schedule_interval='0 2 * * *', # 每天凌晨2点
start_date=datetime(2025, 11, 1),
catchup=False
) as dag:
# 1. 同步用户维度表(批处理)
sync_dim_user = FlinkRunOperator(
task_id='sync_dim_user',
application_args=['--mode=batch', '--table=dim_user'],
flink_cli_conn_id='flink_cluster'
)
# 2. 触发 Doris 物化视图刷新(可选)
refresh_mv = BashOperator(
task_id='refresh_doris_mv',
bash_command='curl -u root: -X POST "http://fe:8030/api/report/sales_daily/_load" ...'
)
sync_dim_user >> refresh_mv
可集成 Flink Kubernetes Operator 实现更云原生的作业提交。
步骤六:报表与监控
报表层
- BI 工具:Superset / FineReport / Tableau 直连 Doris
- API 服务:Spring Boot + MyBatis 查询 Doris,供前端调用
- 大屏展示:ECharts + WebSocket 实时推送(从 Doris 轮询或 Kafka 推送)
监控体系
|---------|-------------------------------------|
| 组件 | 监控项 |
| Flink | Checkpoint 间隔、背压、TaskManager 内存 |
| Doris | Query QPS、Load 延迟、BE 磁盘使用率 |
| Airflow | DAG 失败率、任务积压 |
| 集成工具 | Prometheus + Grafana + AlertManager |
5. 方案优势对比(vs DataX 方案)
|-----------|-----------------------|-----------------------------|
| 维度 | DataX + DataX-Web | Flink + Doris + Airflow |
| 时效性 | T+1(离线) | 秒级~分钟级(实时+离线) |
| 计算能力 | 仅 ETL 同步 | 流批一体复杂计算(窗口、CEP、ML) |
| 查询性能 | 依赖目标库 | Doris 向量化引擎,亚秒级响应 |
| 扩展性 | 单机/简单集群 | 分布式架构,水平扩展 |
| 适用场景 | 中小规模报表 | 高并发、实时分析、数据产品 |
| 运维复杂度 | 低 | 中高(需专业团队) |
6. 最佳实践与注意事项
6.1 性能优化
- Flink:合理设置 state TTL、checkpoint 间隔、并行度
- Doris:分区裁剪、物化视图、Colocate Join
- Kafka:合理设置分区数,避免数据倾斜
6.2 数据一致性
- 实时链路:Flink + Doris 支持 Exactly-once(需开启两阶段提交)
- 离线链路:Airflow 任务幂等设计,避免重复写入
6.3 成本控制
- 冷热分离:Doris 支持冷数据自动迁移到对象存储(2.0+)
- 资源隔离:Flink on K8s 按业务划分命名空间
6.4 安全合规
- Doris 开启 LDAP 认证
- Kafka 启用 SASL/SSL
- Airflow RBAC 权限控制
7. 总结
Flink + Doris + Airflow 是面向未来的现代化数据架构组合:
- Flink 作为统一计算引擎,打通实时与离线;
- Doris 作为统一存储与查询引擎,简化 Lambda 架构;
- Airflow 作为调度中枢,实现端到端任务治理。
该方案适用于对 数据时效性、查询性能、系统稳定性 有较高要求的中大型企业,可支撑从运营报表到实时风控、用户画像等复杂场景。
适用阶段:企业数据中台建设、实时数仓升级、BI 系统重构