Flink+Doris/StarRocks:实时数仓的最后一公里
写入模式 · 主键模型 · 微批优化 · 数据一致性
📋 面试题
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不擅长,实时写入场景更友好。