Flink BlackHole SQL Connector /dev/null 式“吞数据”Sink,压测与验证的神器
·
1. 最小可用 DDL
CREATE TABLE blackhole_table (
f0 INT,
f1 INT,
f2 STRING,
f3 DOUBLE
) WITH (
'connector' = 'blackhole'
);
写入:
INSERT INTO blackhole_table
SELECT f0, f1, f2, f3 FROM some_table;
你会发现:作业在跑、吞吐很高、但没有任何外部输出(这就是它的目的)。
2. LIKE 方式:快速把某张表“替换成黑洞”
调试/压测时经常想把某个 sink 暂时换掉:
CREATE TABLE blackhole_sink WITH (
'connector' = 'blackhole'
)
LIKE source_table (EXCLUDING ALL);
然后把原来的 INSERT INTO real_sink ... 改成写入 blackhole_sink,就能立刻判断:
- 性能瓶颈是不是外部系统(把外部 IO 去掉后吞吐是否暴涨)
- SQL/UDF 本身是否有问题(不受外部写入失败干扰)
3. 和 Print 的区别:一个“看数据”,一个“只测性能”
- Print:把每行写到 Task 日志,适合看数据形态、RowKind、字段值;但日志 IO 会很重
- BlackHole:完全不输出,适合压测、跑通链路、测算子性能上限
经验用法:
- 先用 Print 在小流量下确认结果正确
- 再切 BlackHole 做大流量压测,看吞吐/背压/CPU/GC
4. 经典压测组合:DataGen → SQL → BlackHole
用 DataGen 造数据,上游无限流,sink 用 blackhole 吞掉,测你这段 SQL 的极限吞吐:
CREATE TABLE gen_src (
id BIGINT,
score INT,
name STRING
) WITH (
'connector' = 'datagen',
'rows-per-second' = '50000',
'fields.id.kind' = 'sequence',
'fields.id.start' = '1',
'fields.id.end' = '1000000000',
'fields.score.min' = '0',
'fields.score.max' = '100',
'fields.name.length' = '20',
'fields.name.var-len' = 'true'
);
CREATE TABLE bh_sink (
id BIGINT,
score INT,
name STRING
) WITH (
'connector' = 'blackhole'
);
INSERT INTO bh_sink
SELECT id, score, name
FROM gen_src
WHERE score >= 50;
这套非常适合你用来验证:
- filter / projection / UDF / join / agg 哪个最吃 CPU
- 调高
rows-per-second后是否出现背压(sink 不会是原因)
5. 生产/排障小建议(很实用)
- 定位外部 sink 瓶颈:real sink → blackhole,如果吞吐立刻上去,问题大概率在外部系统或 sink 配置(bulk、flush、并发、重试等)
- 评估 SQL 复杂度成本:blackhole 下仍然跑不动,说明计算本身(UDF/聚合/Join/state)就是瓶颈
- 不要指望它验证数据正确性:它不会输出任何记录,正确性要靠 Print / 结果表 / 指标来验证
更多推荐
所有评论(0)