订阅更新

Flink+Doris/StarRocks:实时数仓的最后一公里

Flink 实时计算 20 天 · 第 15 讲 进阶 约 4 分钟读完

写入模式 · 主键模型 · 微批优化 · 数据一致性

本文目录
  1. 📋 面试题
  2. 为什么选Doris/StarRocks?
  3. Flink写Doris的两种方式
  4. 微批写入调优
  5. 数据一致性
  6. 📌 总结

📋 面试题

Flink写Doris/StarRocks有哪些方式?怎么保证性能和数据一致性?


为什么选Doris/StarRocks?

实时数仓的OLAP层需要同时满足:实时写入 + 高并发查询 + 明细和聚合都支持。

引擎 实时写入 查询性能 UPSERT 适合场景
Doris ✅ Stream Load 好 ✅ Unique Key 通用实时分析
StarRocks ✅ Stream Load 更好 ✅ Primary Key 高性能查询
Hologres ✅ 原生支持 好 ✅ 阿里云生态
ClickHouse ✅ 但不擅长 极快(宽表) ❌ 弱 日志分析

我们选Doris。原因:① 支持Unique Key模型天然UPSERT ② 实时写入和高并发查询都OK ③ Flink Doris Connector成熟 ④ 社区活跃中文文档好。

Flink写Doris的两种方式

方式一:Flink SQL(推荐)

CREATE TABLE doris_sink (
    user_id STRING,
    dt STRING,
    pv BIGINT,
    gmv DECIMAL(10,2),
    PRIMARY KEY (user_id, dt) NOT ENFORCED
) WITH (
    'connector' = 'doris',
    'fenodes' = 'doris-fe:8030',
    'table.identifier' = 'analytics.user_daily',
    'username' = 'root',
    'password' = '',
    'sink.label-prefix' = 'flink_user_daily',
    'sink.properties.format' = 'json',
    'sink.buffer-count' = '3',        -- 攒3批
    'sink.buffer-size' = '1mb',       -- 或攒到1MB
    'sink.buffer-flush.interval' = '10s'  -- 或每10秒flush
);

方式二:DataStream API

DorisExecutionOptions execOptions = DorisExecutionOptions.builder()
    .setLabelPrefix("flink-doris")
    .setBufferCount(3)
    .setBufferSize(1024 * 1024)
    .setBufferFlushIntervalMs(10000)
    .setStreamLoadProp(properties)
    .build();

微批写入调优

单条写入是性能杀手。 Doris的Stream Load是HTTP接口,每次调用有固定开销。

❌ 每条数据一次Stream Load → 每秒200次 → 严重反压
✅ 攒1000条或每5秒一次Stream Load → 每秒5万条 → 流畅

关键参数:
  sink.buffer-count: 攒多少批后flush(默认3)
  sink.buffer-size: 攒多大数据后flush(建议1-10MB)
  sink.buffer-flush.interval: 最长等多久flush(建议5-30秒)

我们调优前每秒只能写200条,Flink持续反压。把buffer-size调到5MB、flush interval调到10秒后,吞吐提升到5万条/秒。延迟从分钟级控制在10秒内。

数据一致性

Doris Unique Key模型:
  相同主键的数据自动覆盖 → 天然幂等
  Flink恢复重放数据 → 重复写入 → 结果不变

实际效果:At-Least-Once + 幂等写入 = 等效Exactly-Once

📌 总结

记忆点 内容
选型原因 实时写入+高并发查询+UPSERT
写入方式 Flink SQL(推荐)或DataStream API
微批关键 buffer-size + flush-interval,避免单条写
一致性 Unique Key幂等写入,等效Exactly-Once
性能 微批后吞吐可达万级/秒

▶ 下一篇预告:DAY 16 双流JOIN


Wood聊大数据 | 9年大数据老兵,聊技术、聊职场、聊成长


小红书正文

Flink写Doris最大的坑:单条写入。

Doris的Stream Load是HTTP接口,每次调用有固定开销。单条写每秒只能200条,改成微批(攒5MB或每10秒flush)后吞吐到5万/秒。

数据一致性靠Doris的Unique Key模型:相同主键自动覆盖,Flink恢复重放也不会重复。At-Least-Once+幂等=等效Exactly-Once。

Flink SQL写法最简单:建Doris Sink表指定connector和buffer参数,INSERT INTO就完事。

选Doris不选ClickHouse的原因:Doris支持UPSERT而CK不擅长,实时写入场景更友好。

刷题进度保存在当前浏览器