想象一座日夜运转的超级物流枢纽。西南角是收货区,各地工厂的卡车源源不断把货物卸下;东北角是发货区,快递车排着队等待装货;连接两块区域的是一条条高速传送带。货物经过扫码、分拣、贴标、重组装,从收货区一路流到发货区。这套流程不需要人手动搬运,全靠一个自动调度系统——它知道每批货该走哪条传送带、该送到哪个出口,即使某条线路故障,也能把任务瞬间转给备用线路。 Kafka Connect 就是大数据世界的这套“自动调度系统”。它负责把各种数据源——数据库、文件、云存储、消息队列——“搬进” Kafka 中枢,再分发给下游的数据仓库、搜索服务、实时分析系统。搬运工作由两类连接器完成:Source 连接器像收货区的收货员,把数据从源头接进来;Sink 连接器像发货区的发货员,把数据安全送出去。而 Worker 就是枢纽中的调度员集群,负责分配任务、监控状态、保证管道稳定运转。 无论你要做数据库实时同步(CDC)、日志采集、还是数据入湖入仓,Kafka Connect 都是你手上最趁手的“传送带系统”。本文就通过这座物流枢纽的故事,带你认识它的每一个关键零件。
对 AI 从业者而言,Kafka Connect 是打通“数据生产”与“数据消费”的关键管道基础设施——掌握它,你才能为 AI 应用构建源源不断、稳定可靠的数据入口。
目录
可视化演示
展示Source连接器采集数据经Kafka集群分发至Sink连接器的完整管道,粒子流动模拟数据流转,点击按钮切换各环节详情
本节配有交互动效(进入视口后自动加载,约 3KB)。
Kafka Connect全链路 Source连接器采集多源数据 Kafka集群暂存分发消息流 Sink连接器写入目标系统 端到端Exactly-Once语义保障 三段式管道实现可靠数据集成
连接器概览:枢纽里的两块大屏
设想一座物流枢纽的调度大厅。西北角的收货区车水马龙,东南角的发货区整装待发,连接两区的传送带昼夜不停。墙上大屏只有两行关键指标:收了多少货,发了多少货。整个枢纽的运行逻辑,说到底就这两件事。
Kafka Connect 就是这座枢纽的总设计师。它把数据管道的任务拆成两半:Source 连接器负责把数据从外部系统“收进来”,写入 Kafka 主题;Sink 连接器负责把数据从主题中“送出去”,落到数据库、文件、云存储等目标。中间的 Kafka 主题则是那条永远在运转的传送带——数据在主题里暂存、有序排列,等待被消费。
连接器是 Connect 的最小管理单元。你用一份 JSON 配置声明连接器名称、类名、并发上限和数据参数,再通过 REST API 提交,Connect 集群就自动启动任务。每个连接器可被拆成多个 Task,Task 才是真正跑数据的节点——比如读文件的 Source 有 3 个分片,就可以开 3 个 Task 各读一块。REST API 还支持暂停、恢复、删除连接器,整个生命周期无需重启集群,生产维护非常方便。Connect 有单机与分布式两种运行模式:单机适合开发调试,分布式适合生产环境。
入门 Kafka Connect 不必被五花八门的概念吓住。你只需要时刻记得那座枢纽的两块大屏:一块记录收货,一块记录发货,中间的传送带归 Kafka 管。弄懂了这三段的关系,后面的每一个零件都只是在这条主线上做文章。
- Source(收货区)从外部数据源拉取记录,并转换为 Kafka 消息。
- produce(上架传送带)将记录按主题发布到 Kafka,这是 Source 端唯一要做的动作。
- Topic(传送带)Kafka 中的有序消息日志,连接 Source 与 Sink 两端的缓冲区。
- consume(取下分拣)Sink 从主题消费消息,再写入外部目标系统。
Source连接器:收货员的进货清单
调度大厅里堆放着一叠待签收的送货单:X 仓库来了 3 箱,Y 工厂来了 5 箱,Z 门店来了 8 箱。收货员按单核对、扫码入库,再把每个包裹放上传送带。收货员从不关心包裹里面装了什么,只保证“单货一致”地搬进系统。
Source 连接器就是这样的收货员。它对接数据源——某张数据库表、一批日志文件、一个消息队列——然后按固定频率轮询读取新增数据。Kafka Connect 内置了常用的 Source:FileStreamSource 监控文本文件的新增行,JdbcSource 通过增量字段查询数据库表,还有专做数据库日志解析的 Debezium。它们都把外部数据转换成 Kafka 消息,发布到指定主题。
Source 的轮询机制是理解它的钥匙。每个 Task 周期性调用 poll() 方法,返回一批待发布的记录;Connect 框架负责把记录序列化后写入主题。为保证断点续传,Source 需要记录读取位置 offset:文件流记录字节位置,JDBC 记录上一次读到的主键或时间戳,只有成功 publish 后才会推进 offset。Source 的并行度通过 max.tasks 参数设置,但实际并行受限于数据源可分片数量。
下次配置 Source 时,先数一数你的数据源能拆成几个“送货单分组”:一个日志目录可以按文件名分片,一张大表可以按主键范围分片。把 max.tasks 设置到与分片相等或略小,每个收货员才有活干,传送带才能满载。
- max.tasks(期望人数)配置文件中声明的最大任务数,表示你希望开几个 Task。
- shards(送货单分组数)数据源可拆分的独立分片数,比如文件数、数据库分区数。
- min(取小者)有效任务数取二者较小值,多余任务只能空转等待。
Sink连接器:发货员的装车清单
发货区的规则完全相反:从传送带上取下包裹,按地址装车。发货员每装完一车,就在系统里勾选“已出库”。若发现地址贴错,他会退回分拣台重新处理,而不是硬塞进错误的车厢。
Sink 连接器就是发货员。它订阅一个或多个 Kafka 主题,把消息批量写入外部目标:数据库表、对象存储、搜索引擎、数据仓库。Sink 的核心动作是 put():Task 拿到一批 ConsumerRecord,交给外部系统写入。Connect 内置的 JDBC Sink 可以把消息转成 INSERT/UPDATE,S3 Sink 则把消息攒成文件再上传,Elasticsearch Sink 则把消息变成文档索引。
Sink 的可靠性由 offset 提交机制守护:只有这一批消息成功写入外部目标后,Task 才提交消费者偏移量。若写入过程抛异常,偏移量保持原样,下次重新拉取这批消息——这就是“至少一次”语义。配合幂等设计(例如主键冲突时走 UPDATE),重试不会产生重复数据。批量大小则通过 batch.size 与时间阈值控制,攒够一批再写入,避免频繁小事务拉低吞吐。
所以在设计 Sink 目标表时,不妨为它留一把“幂等锁”:唯一键、更新时间戳、覆盖写策略。这样即使发货员多试几次,也不会在目标系统里留下重复包裹。容忍重试,正是 Sink 连接器在不可靠网络上保持可靠的法宝。
- p(单次成功率)外部系统一次写入请求成功的概率,受网络和目标系统影响。
- n(重试次数)失败后最多再尝试的次数,配置项为 retries。
- 极限趋近 1(最终一致)重试越多次,整体失败率越低,最终达到“至少一次”的可靠投递。
Worker集群:调度室的扩编之谜
双十二前夕,枢纽决定扩编:调度室从 1 人变成 5 人。几个人共用同一块任务看板:新来的调度员自动认领待办单,休假的调度员留下的单子立即被其他人接手。整个扩编过程,没让任何一辆货车等待。
这 5 个调度员就是 Connect 的 worker 集群。Connect 提供两种运行模式:单机模式(standalone)适合开发调试,一个进程运行全部连接器,配置写在本地文件;分布式模式(distributed)是生产标配,多个 worker 进程组成集群,通过 group.id 识别彼此,共同执行所有连接器任务。
分布式集群的秘密藏在 Kafka 内部主题里:config topic 保存所有连接器配置(相当于任务看板内容),status topic 记录运行状态,offset topic 记录每个 Task 的消费位点(相当于出库记录)。当 worker 加入或宕机时,集群自动触发 rebalance,把 Task 重新分配到存活的 worker 上。worker 本身不保存本地状态,所以任何一台机器挂掉,整条管道都不会中断。
Worker 集群的高可用,本质上是“把状态交给 Kafka,把任务分给活人”。调度员可以换人,但任务看板和出库记录都保存在公用的 Kafka 里。这也是为什么 Kafka Connect 能成为生产环境里最让人放心的管道基础设施之一。
- ΣN_task(任务总数)所有连接器拆出的 Task 数量之和,代表需要并发执行的工作量。
- C_worker(单人承载量)一台 worker 能稳定承载的 Task 上限,取决于 CPU 和内存资源。
- 向上取整(不缺人手)结果遇到小数向上取整,保证 worker 数足够承载全部任务。
转换与模式:包裹的再加工线
仓库里有一种常见的增值服务:把零散包裹按收货城市重新打包,把面单上的旧地址换成新标签,再贴上一张全城统一的“标准箱单”。这些加工发生在枢纽内部,收货方完全无感知,收到的却总是合胃口的样子。
Kafka Connect 的 SMT(单消息转换)和 Schema 就是这套加工线。SMT 在消息穿越连接器的过程中修改内容:添加字段、删除敏感字段、重写 Key、格式化时间戳。Schema 则相当于标准箱单,它声明了消息里每个字段的名字、类型和结构。Schema Registry 负责维护箱单的版本,新版本只要兼容旧版本,老消费者照样能读。
SMT 配置是一串按顺序执行的转换器列表。以 Source 为例,数据从数据源读出来后、还没进主题前,先经过 T1、T2、T3——例如先 trim 掉空格,再添加一个环境标签字段,最后把嵌套结构拍平。同理,Sink 的 SMT 在写入目标前执行,比如把 Kafka 中的嵌套 JSON 展开成目标表的扁平列。序列化则由 Converter 决定:Avro、JSON、Protobuf 均可,其中 Avro 配合 Schema Registry 能提供最强的兼容性保证。
设计 SMT 时要有“快递面单思维”:上游消息是客户的原始包裹,下游目标只关心标准箱单。在连接器内部一次性加工好,下游就不用手写额外解析逻辑,整个数据管道的工程质量也随之提升。
- m(原料消息)进入连接器时的原始消息,包含原始字段。
- T_i(第 i 台加工机)一个 SMT 转换逻辑,输入一条记录,输出一条记录。
- 嵌套调用(流水线顺序)前一个转换的输出作为后一个转换的输入,按配置顺序执行。
- m'(成品消息)完成全部转换后的最终消息,随后被序列化写入主题或目标系统。
CDC实务:收银台的扫码枪
总部的库存系统想知道每家门店卖了多少货。传统做法是每晚让门店传一份库存快照,但总部总嫌 24 小时前的数据太旧。于是总部给收款机装上“扫码枪”:每卖出一件货,就记一条变更记录,实时同步给总部。老板随时打开手机,看到的都是当前库存。
CDC(Change Data Capture,变更数据捕获)就是数据库领域的扫码枪。它不是每隔几分钟去整表扫描,而是直接读取数据库的 binlog/redo log,把每条 INSERT、UPDATE、DELETE 记录转成一条 Kafka 消息。Kafka Connect 生态里最常用的 CDC 连接器是 Debezium,它像一台翻译机,把 MySQL 或 PostgreSQL 的变更日志翻译成结构化的 Kafka 消息。
Debezium 的同步分两段:首次启动先打一次全量快照(SNAPSHOT),把当前所有数据读出来变成一批消息;全量结束后进入增量模式,实时跟踪日志流。每条变更消息里包含 before/after 字段和操作类型 op:c 表示创建、u 表示更新、d 表示删除、r 表示快照阶段读取。下游消费这些事件后,就能精确重放数据库的每一次变化,用于同步副本、审计、实时数仓或搜索索引更新。
有了“扫码枪 + 变更日志”,仓库与总部之间不再需要每晚搬运整本账本。变化本身,才是数据管道里最有价值的货物。
- D_t(全量快照)某个时刻表里的全部数据集合。
- ΔD(变化量)两个时刻数据集合的对称差,代表所有发生变更的记录。
- 事件集(日志流)变化量被数据库日志拆成 k 条有序变更事件,每条包含操作类型与前后镜像。
- 可重放(事件溯源)依次应用这 k 条事件,可在下游重建与源库一致的状态。
并行度调优:传送带与分拣槽的匹配
大促临近,枢纽的传送带成了瓶颈:大量快递堆积在收货区。运营团队讨论:是加传送带,还是让每条传送带跑得更快?答案往往是——传送带要加,但入口的货物分配也得跟上,否则加了也是空转。
Kafka Connect 的并行度调优同样围绕“传送带数量匹配”展开。并行度由 max.tasks 控制,但实际并行效果受限于 Topic 的分区数:Sink 连接器的每个 Task 消费一个或多个分区,若 max.tasks 超过分区数,多余 Task 就会空闲。Source 端则受限于上游分片数。
调优的关键步骤:第一,检查 Topic 分区数,确保不少于 max.tasks,最理想是成整除关系,让各 Task 负载均衡;第二,合理规划 worker 数量与 Task 数的比值,避免单机线程过多导致上下文切换;第三,通过监控 consumer lag、任务健康度和 worker 负载定位瓶颈——lag 持续增长说明 Sink 写入太慢,需要扩容或优化批量参数;第四,动态调整配置并观察吞吐曲线,找到当前资源下的最优值。
加传送带之前,先数一数货物入口的分拣槽数量——分拣槽不够,传送带加得再多也只是空转的履带。这个比喻同样适用于生产环境的资源规划:一个健康的数据管道,分区数、Task 数、worker 数应当像齿轮一样严丝合缝。
- N_task(配置任务数)连接器配置中声明的并行任务数量。
- N_partition(分拣槽数)Kafka 主题的分区数量,是并行消费的上限。
- min(取小者)有效并行度等于二者中的较小值。
- 推理(空转判断)若 N_task > N_partition,多余 Task 无分区可消费,属于资源浪费。
开发扩展:开放给所有承运商的协议
市场上没有哪个承运商能覆盖所有运输场景。于是枢纽开放了“自定义协议”接口:任何运输公司只要遵循统一的安全标准,就可以接入枢纽的装卸系统,成为新的收货或发货渠道。
Kafka Connect 的可扩展性同样出色。如果内置连接器不满足需求,开发者可以实现自定义连接器:Source 连接器继承 SourceConnector,Sink 连接器继承 SinkConnector,并实现对应的 Connector 与 Task 接口。打包成插件放入 plugins 路径,通过 REST API 即可热加载——不用重启集群,新连接器立即生效。
两个接口是关键。Connector 类负责配置校验和任务拆分:收到连接器配置后,调用 taskConfigs(maxTasks) 决定创建多少个 Task,并把每个 Task 的子配置传下去;Task 类负责实际数据搬运,实现 start() 与 poll()(Source)或 put()(Sink)。开发者还需选择 Converter 决定消息格式(Avro / JSON / String),以及匹配的 SMT。插件以“连接器 + 转换器 + 转换器”整体打包,一并放入 plugin.path,Connect 启动时自动扫描。
自定义连接器的魅力在于:任何数据源和数据目的,只要遵守协议,就能接入这座永不停止运转的枢纽。连接器的价值,正在于把“搬数据”这件脏活累活标准化、工程化、规模化。
- Connector(核心装配逻辑)定义连接器对外暴露的配置项,以及如何把配置拆分成 Task 配置。
- Converter(翻译官)负责 Connect 内部数据模型与字节流之间的互相翻译,比如 Avro/JSON。
- Transform(加工师)对消息做字段级改造,与上一节的 SMT 完全一致。
- Plugin(整体打包)把以上零件统一放进 plugin.path,Connect 插件系统自动发现加载。
AI 应用场景
场景1:电商数据库实时同步
阶段:数据采集 / 数据管道建设
解决的问题:传统定时 ETL 每小时抽取一次,数仓里的库存和销量数据至少滞后 1 小时,大促时报表严重失真。用 Debezium(Source)监听 MySQL binlog → Kafka → JDBC Sink 写入 ClickHouse,链路延迟可以压缩到秒级。
具体案例:某电商平台将订单表接入 Kafka Connect,订单状态从“已支付”到“已发货”的变化以毫秒级事件进入数仓。BI 报表实时刷新,运营能直接看到当前实时 GMV 和库存水位,大促当天也没有出现数据积压。
场景2:日志采集入湖
阶段:数据管道 / 数据存储
解决的问题:大量 Nginx 访问日志、应用日志散落在各台服务器上,排查问题时难以统一检索。用 FileStreamSource 采集日志文件新增行,写入 Kafka 主题,再用 S3 Sink 按时间分区批量落盘为 Parquet 格式,最终由查询引擎统一分析。
具体案例:某在线教育公司把全量学习行为日志通过 Connect 管道入湖,数据规模从每天 100GB 增长到 2TB 时,只靠增加 worker 节点就完成了水平扩展。
场景3:搜索与向量检索索引同步
阶段:AI 应用数据同步 / RAG 知识更新
解决的问题:RAG 应用依赖向量数据库中的文档切片与用户画像,但业务库的数据变化无法实时反映到索引中。用 CDC Source 监听业务表变更 → Kafka → Elasticsearch Sink 或向量数据库 Sink,让搜索索引和向量库始终与源库保持一致。
具体案例:一个客服知识库系统,每次运营在后台更新 FAQ 文档,5 秒内向量索引即可完成同步,AI 助手回答内容的时效性大幅提升。
Python 演示
import csvimport jsonimport osfrom concurrent.futures import ThreadPoolExecutor CSV_FILE = "orders.csv" def make_demo_csv(): """生成一份演示订单数据文件,模拟外部数据源。""" with open(CSV_FILE, "w", newline="") as f: writer = csv.writer(f) writer.writerow(["id", "city", "amount"]) writer.writerow([1, "北京", 99.5]) writer.writerow([2, "上海", 120.0]) writer.writerow([3, "广州", 45.8]) writer.writerow([4, "杭州", 68.3]) class Pipeline: """迷你 Kafka Connect 管道:Source -> Transform -> Sink。""" def __init__(self, task_count=2): self.task_count = task_count def source(self): """Source 连接器:轮询读取 CSV 文件中的每一行记录。""" with open(CSV_FILE, newline="", encoding="utf-8") as f: for row in csv.DictReader(f): yield row def transform(self, record): """Transform:把字符串字段转换为结构化类型,相当于 SMT。""" return { "id": int(record["id"]), "city": record["city"].strip(), "amount": round(float(record["amount"]), 2), } def sink(self, record): """Sink 连接器:把记录投递到目标,此处为终端输出。""" print(json.dumps(record, ensure_ascii=False)) if __name__ == "__main__": if not os.path.exists(CSV_FILE): make_demo_csv() pipe = Pipeline(task_count=2) # 用线程池模拟多个 Task 并行执行 Sink 写入 with ThreadPoolExecutor(max_workers=pipe.task_count) as pool: processed = (pipe.transform(r) for r in pipe.source()) list(pool.map(pipe.sink, processed))
from concurrent.futures import ThreadPoolExecutor用线程池模拟 Kafka Connect 中多个 Task 并行工作的场景。def source(self):对应 Source 连接器的 poll() 逻辑,这里是同步迭代器,每次 yield 一条记录。def transform(self, record):对应 SMT 单消息转换,把 CSV 字符串字段清洗成结构化类型。def sink(self, record):对应 Sink 连接器的 put() 逻辑,把一条记录写到目标端。processed = (pipe.transform(r) for r in pipe.source())一条生成器表达式把 Source 和 Transform 串起来,维持流式处理。list(pool.map(pipe.sink, processed))把转换后的记录并行发给 sink,模拟 Kafka Connect 的并行 Task 分发。
常见误区
误区我以为 Kafka Connect 和 DataX、Sqoop 差不多,就是写个定时任务把数据抽来抽去,批处理跑完就结束了。
正解Kafka Connect 本质是实时流式管道,Source 一旦启动就持续轮询数据源,Sink 持续消费,消息以秒级甚至毫秒级延迟流动。它更像物流枢纽里永不停歇的传送带,而不是每晚一次的搬家公司卡车。虽然它也能做一次性导入,但设计目标是“持续运转的管道”。
为何常见:很多人接触 Kafka Connect 时先看到的是全量同步演示,忽略了它的主力场景是 CDC 与实时事件流。
误区我一直以为 Source 连接器是主动把数据推送到 Kafka,像调用 API 一样把每条记录发出去。
正解实际上 Source 连接器采用“拉取 + 轮询”模式。Task 周期性调用 poll() 从外部数据源取一批数据,然后由 Connect 框架统一写入 Kafka。它更像收货员定期去门口看看有没有到货,而不是工厂主动往传送带上倒货。理解这一点有助于调整轮询间隔参数,而不是盲目调大发送线程。
为何常见:从网络编程的视角看,生产者通常都是 push 语义,容易把这种直觉迁移到 Source 连接器上。
误区我觉得只要把 max.tasks 调到很大,管道吞吐就会线性上涨,比如从 8 调到 100。
正解并行任务数受两把锁约束:Source 端受数据源分片数限制,Sink 端受主题分区数限制。分区数只有 6 的话,设 100 个 Task 也只有 6 个在干活,其余 94 个空转,反而白白占用 worker 线程和内存。调优的正确姿势是先看分区数,再让 Task 数和它匹配。
为何常见:人们的直觉是“人多力量大”,但忽略了 Kafka Connect 的并行度数学模型是 min 函数而不是加法。
误区我以为 CDC 就是把全表扫描的频率提高,比如从每小时一次改成每 10 秒一次,效果就接近实时了。
正解CDC 完全不靠扫描整表来发现变化,它直接订阅数据库的 binlog 日志流。数据库的每一次写操作都会在日志里留下痕迹,Debezium 只是把这些痕迹读出来变成消息。两者区别巨大:定时扫描每次都要全表比较,数据库压力大且实时性差;CDC 读取日志几乎不打扰业务库,还能做到毫秒级延迟。
为何常见:大多数人对增量同步的认知停留在“定时查询变化字段”的老方案,不知道还有日志解析这条更优雅的路径。
误区我觉得反正 REST API 能增删改连接器,那我只要会调接口就行,什么 worker、offset、rebalance 都不用懂。
正解REST API 只是遥控器,真正决定管道可靠性的是内部机制。比如 offset 什么时候提交直接决定数据会不会丢、会不会重;worker 宕机后的 rebalance 决定恢复时间;config topic 的同步决定配置能否一致生效。不懂这些机制,遇到消息重复或 worker 抖动就会无从下手。
为何常见:管理接口的易用性会掩盖底层复杂度,容易让初学者产生“会点接口就会用”的错觉。
面试题
Q1. 在 Kafka Connect 中,Source 连接器的主要职责是?
- A.把外部数据源写入 Kafka 主题← 正确答案
- B.把 Kafka 主题数据写入目标系统
- C.负责 Kafka 主题的分区扩容
- D.负责消息格式的序列化转换
答案:A。Source 连接器对应物流枢纽的收货员,负责把数据从外部系统接进来并发布到 Kafka 主题;方向是“外 → Kafka”。B 是 Sink 的职责,C 和 D 都不是连接器的主职责。
Q2. 分布式模式下,worker 之间的配置与状态存放在哪里?
- A.每个 Worker 的本地配置文件中
- B.Kafka 的内部主题中集中管理← 正确答案
- C.Zookeeper 独立的数据存储区
- D.HDFS 的分布式共享目录中
答案:B。分布式 Connect 集群用 Kafka 内部主题(config、status、offset)存放配置、运行状态和消费位点。这样任何 worker 加入或退出,新节点都能从主题中同步到全部状态,实现高可用。
Q3. 某 Sink 连接器设置 max.tasks=10,但 Topic 只有 6 个分区,实际有效并行 Task 数为?
- A.10 个 Task 全部参与消费
- B.最多 6 个 Task 参与消费← 正确答案
- C.4 个 Task 参与其余空闲
- D.2 个 Task 参与其余挂起
答案:B。有效并行度等于 min(max.tasks, 分区数)。分区数 6 是消费并行上限,10 个 Task 里只有 6 个能领到分区,其余 4 个空转。这个数学关系和正文中“分拣槽数量限制传送带数量”完全对应。
Q4. 关于 Kafka Connect 的 SMT(单消息转换),下列说法正确的有?
- A.在 Source 写入 Topic 之前可生效← 正确答案
- B.在 Sink 写入目标之前可生效← 正确答案
- C.可以新增删除修改消息字段← 正确答案
- D.必然改变 Topic 的分区数量
答案:ABC。SMT 像枢纽里的再加工线,在连接器内部对消息做字段级加工,Source 侧先加工再进主题,Sink 侧先消费再加工。A、B、C 都是 SMT 的典型能力;D 错误,SMT 不负责分区分配,分区由分区器决定。
Q5. Debezium 连接器实现 CDC 依赖的底层机制是?
- A.定期对源表进行全量扫描
- B.解析数据库的 binlog 变更日志← 正确答案
- C.读取数据库的静态元数据
- D.通过快照恢复实现数据复制
答案:B。Debezium 读取 MySQL/PostgreSQL 的 binlog 日志流,把 INSERT/UPDATE/DELETE 翻译成 Kafka 消息。它不整表扫描,也不依赖静态元数据。A 是旧式增量同步方案,D 与 CDC 无关。
Q6. 自定义一个 Source 连接器,必须实现的两个核心类是?
- A.SourceConnector 与 SourceTask← 正确答案
- B.SourceConnector 与 SinkConnector
- C.Converter 与 ConnectRecord
- D.Worker 与 RebalanceListener
答案:A。SourceConnector 负责配置校验和任务拆分,SourceTask 负责实际 poll() 搬运数据。B 是两种连接器的拼凑,C 和 D 是辅助类,不是自定义 Source 连接器的核心。
Q7. Kafka Connect 的 REST API 最常见的用途是?
- A.创建配置与管理连接器生命周期← 正确答案
- B.完全替代生产者的消息发送功能
- C.修改 Kafka 主题的分区数量
- D.提供数据仓库的 SQL 查询接口
答案:A。REST API 是 Connect 的遥控器,用来提交、暂停、恢复、删除连接器配置。它不负责生产消息、不管理主题分区,也不是查询引擎接口。
Q8. 以下哪些手段可以有效提升 Kafka Connect 管道的吞吐量?
- A.使 Topic 分区数不少于 Task 数← 正确答案
- B.将多个 Task 分散到不同 Worker 节点← 正确答案
- C.增加没有分区可消费的空闲 Task
- D.调大批次大小并缩短 poll 间隔← 正确答案
答案:ABD。A 解除并行度上限,B 让资源横向扩展,D 让每次处理的数据量更大。C 是典型误区——空闲 Task 不仅不提升吞吐,还浪费资源。吞吐优化遵循“分区数 ≥ Task 数,worker 资源充足,批处理参数合理”三大原则。
Q9. Sink 连接器实现“至少一次”交付语义的核心机制是?
- A.偏移量在数据成功写入后才提交← 正确答案
- B.每条消息被无限重复地发送
- C.消费前立即提交全部偏移量
- D.每次写入前先删除目标旧数据
答案:A。Sink 写入成功后才提交 offset,失败则 offset 不变,下次重新拉取这批消息,保证不丢数据。C 会导致失败时数据永久丢失。B 和 D 描述既不符合语义也不符合工程实现。
Q10. 分布式模式下,某个 worker 节点宕机,连接器任务会发生什么?
- A.任务自动迁移到其他存活 Worker 并续跑← 正确答案
- B.必须手动通过 REST 接口重新创建任务
- C.任务永久丢失且数据无法找回
- D.整个集群停止写入并等待人工介入
答案:A。Connect 集群监听 worker 的加入与离开,宕机触发 rebalance,由 group 协调器把任务重新分配给存活 worker。这正是“调度组共享任务看板”的高可用设计——单点故障不中断整条管道。