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 系统重构

相关推荐
管理大亨3 小时前
光伏大棚智慧管理:ELK数据中枢
大数据·运维·elk·elasticsearch
MuseDAM_cc3 小时前
企业素材找不到?DAM 3 步解决资产分散
大数据·人工智能
山峰哥4 小时前
数据库性能优化实战:从工程架构到SQL调优的深度解析
大数据·数据库·oracle·性能优化·架构·深度优先
山东小木4 小时前
AI应用开发:节点化思维链与Skills经验库如何重塑企业级AI智能体
大数据·人工智能·skills·java ai·springboot ai
Elastic 中国社区官方博客4 小时前
使用 Node.js Elasticsearch 客户端索引大型 CSV 文件
大数据·elasticsearch·搜索引擎
老蒋新思维14 小时前
创客匠人启示:破解知识交付的“认知摩擦”——IP、AI与数据的三角解耦模型
大数据·人工智能·网络协议·tcp/ip·重构·创客匠人·知识变现
Jackeyzhe14 小时前
Flink源码阅读:如何生成JobGraph
flink
爱埋珊瑚海~~14 小时前
基于MediaCrawler爬取热点视频
大数据·python
工程师丶佛爷14 小时前
从零到一MCP集成:让模型实现从“想法”到“实践”的跃迁
大数据·人工智能·python