Kafka Connect-Standalone 模式

Kafka connect 就是一个数据传输的工具,可以使用connect非常方便的将外部系统当中的数据可以和Kafka之间做数据的传递。

比如说文件,比如说数据库。可以将文件中的数据导入到Kafka当中,也可以将MySQL中的数据导入到Kafka中。还可以将Kafka中的数据导出到MySQL,HDFS,离线的本地文件等等这些外部的存储设备。

比如也可以使用flume去采集日志文件的数据导入到Kafka中,或者将Kafka的数据导出到HDFS,这些其实也是可以去做到的。但是Kafka connect有它自己的优势,比如Kafka connect可伸缩,安全可靠,而且是一个流式的处理。

自动offset管理,生产者生产的消息是有offset,消费消费的消息也是有offset。如果要将数据库中的数据或者文件中的数据导入到Kafka,那数据库和文件扮演的是生产者的角色。Kafka拉取数据得知道拉取到什么位置了。这个文件中有新的行出现的时候,它得知道拉取什么样的数据。

而kafka offset是自动维护的,不需要手动去进行管理。

Kafka connect 就是一个与外部存储系统,数据系统之间的数据导入和导出的一个工具。

Kafka connect 单机模式

启动命令至少两个参数,一个是connect-stand-alone的一个配置,从第二个参数往后就是各种connect的配置了。

source是一种connect,sink也是一种connect。所以要将source的配置和sink的配置都放在后面的配置文件当中。

目录结构说明

复制代码
kafka conf目录下的文件
├── connect-standalone.properties  # Connect 运行进程的主配置文件 (配置 JSON Converter)
├── connect-file-source.properties # FileSource Connector 配置文件(读文件 -> Kafka)
├── connect-file-sink.properties   # FileSink Connector 配置文件(Kafka -> 写文件)

文件一:connect-standalone.properties

Connect 运行进程的主配置文件,因为是一个单机版本,所以写localhost也是没有问题的。

bootstrap.servers=localhost:9092

这两个是转换器,当Kafka从外部的存储设备中读到了数据之后把这每一条的数据转换成什么格式,在这里转成了json格式。(Key 和 Value 的序列化方式:使用 JSON 格式)

key.converter=org.apache.kafka.connect.json.JsonConverter

value.converter=org.apache.kafka.connect.json.JsonConverter

默认是打开的状态,打开之后它能够有很多的键值对都存储到Kafka的topic当中。

key.converter.schemas.enable=true

value.converter.schemas.enable=true

Kafka connect会自动的保存offset,在stand alone的模式下,这个offset是保存在一个文件当中的。默认是保存在这个文件当中。(Standalone 模式下保存 Connector 偏移量(Offset)的文件路径)

offset.storage.file.filename=/tmp/connect.offsets

这个是自动保存offset一个偏移量,一个时间,10s。

offset.flush.interval.ms=10000

上面文件的内容其实不需要去修改什么。connect-standalone.properties 内容:

复制代码
bootstrap.servers=10.20.13.111:9092,10.20.12.107:9092,10.20.13.112:9092

key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true

offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000

plugin.path=/apps/svr/kafka/libs

errors.tolerance=all
errors.log.enable=true
errors.log.include.messages=true

文件二:connect-file-source.properties

读取本地 JSON 文件并发送到 Kafka Topic 的 Connector 配置。

name=local-file-source 这个可以随便取,这个就是source的名字

connector.class=org.apache.kafka.connect.file.FileStreamSourceConnector 这个是读取文件的类

tasks.max=1 这个任务要跑在多少个task当中,stand alone只有一个task

file=/home/apps/access.log 要读取文件的位置

topic=connect-test 读到了文件之后将消息存在哪个主题当中

复制代码
name=local-file-source
connector.class=org.apache.kafka.connect.file.FileStreamSourceConnector
tasks.max=1
file=/home/apps/access.log
topic=connect-test

[apps@TLKYVM202012107 kafka]$ bin/kafka-topics.sh --create --topic connect-test --bootstrap-server 10.202.13.111:9092,10.202.12.107:9092,10.202.1
3.112:9092 --partitions 3 --replication-factor 3
Created topic connect-test.

文件三:connect-file-sink.properties

name=local-file-sink

connector.class=org.apache.kafka.connect.file.FileStreamSinkConnector

tasks.max=1

file=test.sink.txt 最后数据要保存到什么文件当中

topics=connect-test

复制代码
name=local-file-sink
connector.class=org.apache.kafka.connect.file.FileStreamSinkConnector
tasks.max=1
file=/home/apps/access.log.sink
topics=connect-test
复制代码
[apps kafka]$ ./bin/connect-standalone.sh -daemon  config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties

[apps kafka]$ jps -l
58531 kafka.Kafka
9446 org.apache.zookeeper.server.quorum.QuorumPeerMain
84262 sun.tools.jps.Jps
20844 org.apache.kafka.connect.cli.ConnectStandalone

数据未写入文件(FileSink 无输出)诊断

通常是因为 Topic 中尚无新消息 、Connector 无法读取文件(权限/路径错误) 、或者 Converter 模式不匹配导致解析失败。

**1.检查 Source 文件的追加写入:**验证消息触发。

FileStreamSourceConnector 默认只读取启动后新增追加(Append)的内容 ,或者从上次 offset 继续读。如果 test-input.txt 在启动前就已经写入完毕,Connector 不会自动重新读取整份文件。

在控制台运行以下命令追加一条新的 JSON 数据:

复制代码
[apps ~]$ echo '{"id": 1, "name": "Kafka Test"}' >> access.log

验证方式 :观察控制台日志是否有数据发送记录,并检查 access.log.sink 是否产生数据。

**2.检查 Kafka Topic 是否有数据:**确认 Source 是否成功发消息。

使用 Kafka 自带的命令行消费者,确认 FileStreamSource 是否成功将数据写入到了 Kafka Topic 中:

复制代码
[apps kafka]$ bin/kafka-console-consumer.sh  --bootstrap-server 10.202.13.111:9092,10.202.12.107:9092,10.202.13.112:9092 --topic connect-test  --from-beginning
{"schema":{"type":"string","optional":false},"payload":"{\"id\": 1, \"name\": \"Kafka Test\"}"}
{"schema":{"type":"string","optional":false},"payload":"{\"id\": 1, \"name\": \"Alice\", \"role\": \"admin\"}"}
{"schema":{"type":"string","optional":false},"payload":"{\"id\": 1, \"name\": \"Alice\", \"role\": \"admin\"}"}
{"schema":{"type":"string","optional":false},"payload":"{\"id\": 1, \"name\": \"Alice\", \"role\": \"admin\"}"}
{"schema":{"type":"string","optional":false},"payload":"{\"id\": 1, \"name\": \"Alice\", \"role\": \"admin\"}"}
{"schema":{"type":"string","optional":false},"payload":"{\"id\": 1, \"name\": \"Alice\", \"role\": \"admin\"}"}
{"schema":{"type":"string","optional":false},"payload":"{\"message\": \"hello kafka\"}"}

**3.排查 JsonConverter 格式匹配问题:**检查 Schema 开关。

如果 connect-standalone.properties 中设置了 value.converter=org.apache.kafka.connect.json.JsonConverter,请核对 schemas.enable 的设置:

  • 如果 value.converter.schemas.enable=false :Topic 中的消息必须是纯 JSON(例如 {"id":1})。

  • 如果 value.converter.schemas.enable=true :Topic 中的消息必须包含 schema 和 payload 结构(例如 {"schema":{...},"payload":{"id":1}})。

若配置与实际消息格式不匹配,Sink 会跳过或抛出转换异常。

验证方式 :查看启动终端输出的日志中是否有 DataException 或 ParseException。

**4.检查文件路径与写权限:**确认输出文件创建成功。

检查 connect-file-sink.properties 中的 file 路径:

  1. 确认指定路径的上级目录是否存在且当前运行 Kafka 的用户拥有写权限。

  2. 如果写的是相对路径,它会创建在执行启动命令时的当前工作目录下。

验证方式 :使用绝对路径测试(例如 file=/home/apps/access.log.sink),并检查该路径下是否成功创建了文件。

**5.检查 logs 目录下的日志文件:**定位后台日志。

-daemon 模式默认会将控制台标准输出和错误日志重定向到 Kafka 安装目录下的 logs/ 文件夹中(例如 connect.out 或 connect.log)。

相关推荐
紫神2 天前
DDS 通信技术说明
网络·云原生·容器·k8s·dds·弱网
Eminem897 天前
14、k8s持久化存储
k8s
上火的金鱼妹9 天前
higress网关访问+ 模型访问的安全策略管控
k8s·higress·ai网关
weixin_4445793010 天前
Containerd
容器·k8s
Dragon_qu·x11 天前
MongoDB 高可用集群部署
运维·数据库·mongodb·k8s·helm
此冬歌咏18 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心18 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
流烟默18 天前
K8s StatefulSet 详解:有状态应用的“身份证”与“固定住址”
k8s·statefulset
cg.family18 天前
K8S集群手动巡检
k8s
九皇叔叔19 天前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s