在一个SeaTunnel使用流任务获取Kafka topic中的数据时,如果topic从2 个分区扩到了4个分区。结果呢?新分区里的数据,任务一条都消费不到——除非把任务重启一遍。
因为 SeaTunnel 的 Kafka source 默认只会在任务启动时扫描所有分区。
虽然重启可以重新扫描分区,但是还是会有一下问题
SeaTunnel 官方提供了 partition-discovery.interval-millis 参数:定时扫描 Kafka,发现新分区自动纳入消费,任务不用重启。
bin/kafka-topics.sh --create --topic ksource \ --bootstrap-server ip:9092 \ --partitions 2 --replication-factor 1
关键配置就三个点: job.mode = "STREAMING"
显式开启 checkpoint.interval
partition-discovery.interval-millis = 5000。
env {
parallelism = 2
job.mode = "STREAMING"
checkpoint.interval = 5000
}
source {
Kafka {
bootstrap.servers = "ip:9092"
topic = "ksource"
consumer.group = "seatunnel_k_group"
partition-discovery.interval-millis = 5000
start_mode = "EARLIEST"
format = "json"
schema = {
fields {
id = INT
cusname = STRING
amount = DOUBLE
}
}
}
}
sink {
Console {}
}
说明:
启动 SeaTunnel 任务(本地模式):
bin/seatunnel.sh --config job/k.conf -m local
另开一个终端,往 ksource 生产 3 条消息(扩容前 topic 只有 2 个分区,消息轮询分布到 0/1):
bin/kafka-console-producer.sh --broker-list ip:9092 --topic ksource
输入(每行一条):
{"id":1,"cusname":"张三","amount":100.50}
{"id":2,"cusname":"李四","amount":200.00}
{"id":3,"cusname":"王五","amount":300.00}
任务控制台出现对应输出,说明消费正常。
bin/kafka-topics.sh --alter --topic ksource \ --bootstrap-server ip:9092 \ --partitions 4
确认结果:
bin/kafka-topics.sh --describe --topic ksource \ --bootstrap-server ip:9092
继续往 ksource 生产 6 条消息(不指定 key,轮询会分布到全部 4 个分区,其中约一半落到新分区 2/3):
bin/kafka-console-producer.sh --broker-list ip:9092 --topic ksource
输入:
{"id":4,"cusname":"赵六","amount":400.00}
{"id":5,"cusname":"孙七","amount":500.00}
{"id":6,"cusname":"周八","amount":600.00}
{"id":7,"cusname":"吴九","amount":700.00}
{"id":8,"cusname":"郑十","amount":800.00}
{"id":9,"cusname":"钱十一","amount":900.00}
任务控制台陆续输出这 6 条消息——包括落在新分区 2/3 上的消息。任务没有重启,新分区的数据被自动消费了。
把配置里的 partition-discovery.interval-millis 删掉,重复第 4~6 步:
两种配置的差异一览:

这类含逗号/尖括号的类型声明都要加双引号,否则 HOCON 解析直接报错。
partition-discovery.interval-millis 解决的是"Kafka topic 动态扩容"场景下的自动感知问题:配一个正数间隔,SeaTunnel 流任务就能在运行期间定时发现新增分区并自动消费,不用重启、不丢数据、不重放历史。
配套的三个点记住就行:流模式 + 开 checkpoint + 间隔设为正数。新分区的起点看 start_mode,扫描频率和集群负载之间自行权衡。
来源 | 数仓生态圈
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049562/viewspace-3182944/ ,如需转载,请注明出处,否则将追究法律责任。