Flink + Doris + Airflow 构建企业级实时报表统计平台方案

目录

[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. 核心组件说明

  • 流批一体:同一套 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 统一编排,便于扩缩容与运维。

步骤二:数据接入层设计

复制代码
// 示例: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;
  • 每日凌晨同步历史全量数据(如用户维度表)
  • 使用 FlinkRunOperator 提交批作业 JAR 包
场景:实时销售大屏(每分钟聚合)
复制代码
-- 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 系统重构

相关推荐
securitypaper19 小时前
2026年最新发布的 安全生产 行业标准 列表 下载
大数据·安全
Light6019 小时前
从“报告”到“能力”——构建智能化、可审计的数据治理闭环——领码 SPARK 数据质量平台白皮书
大数据·分布式·spark
TDengine (老段)19 小时前
嘉环科技携手 TDengine,助力某水务公司构建一体化融合平台
大数据·数据库·科技·物联网·时序数据库·tdengine·涛思数据
程序猿阿伟19 小时前
《Python生态事件溯源与CQRS轻量化落地指南》
大数据·python·微服务
dajun18112345619 小时前
跨部门工作流泳道图在线绘制工具 PC
大数据·数据库·人工智能·信息可视化·架构·流程图
HZZD_HZZD19 小时前
喜讯|合众致达成功中标G312线傅家窑至苦水公路机电工程FKJD-2标水电表项目
大数据·数据库·人工智能
paixingbang19 小时前
GEO优化服务商领域崛起三强 自主技术驱动AI搜索与位置智能升级
大数据·人工智能
lagrahhn19 小时前
scoop的使用
大数据·python·搜索引擎
AI数据皮皮侠19 小时前
全球首个30米分辨率湿地数据集(2000—2022)
大数据·人工智能
AC赳赳老秦20 小时前
医疗数据安全处理:DeepSeek实现敏感信息脱敏与结构化提取
大数据·服务器·数据库·人工智能·信息可视化·数据库架构·deepseek