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 / 结果表 / 指标来验证

更多推荐