我正在尝试使用file作为我的kafka制作人。源文件不断增长(比如每秒20条记录/行)。以下是与我的问题类似的帖子:
How to write a file to Kafka Producer
但在这种情况下,每次在文件中插入新行时,都会读取整个文件并将其添加到Kafka主题中。我只想将新添加的行发送到主题(即,如果文件已经存在10行,并且还有4行附加到其中,则只需要将4行发送到主题)。
有没有办法实现这个目标?
尝试了其他解决方案:
使用源类型作为'spooldir'的Apache flume。但它没有用,因为它从添加到目录的新文件中读取数据,而不是将数据附加到已读取的文件中。
我们还尝试使用flume source type 作为'exec'和命令作为'tail -F / path / file-name'。这似乎也不起作用。
欢迎使用任何其他工具的建议,因为我的目标是实时读取文件中的数据(即,我需要将数据插入文件后立即)
答案 0 :(得分:0)
根据您的确切需要,您可以查看几个选项。
Kafka Connect
正如上面Chin Huang所述,Kafka Connect的FileSource连接器应该能够执行您想要的操作而无需安装其他软件。查看Connect Quickstart以获取有关如何启动和运行它的指导,他们实际上有一个将文件读入Kafka的示例。
<强> Logstash 强>
Logstash是类似这样的经典选项,它的Kafka输出它可以完成你想要它做的一个或多个文件。以下配置应该可以为您提供您想要的内容。
input {
file {
path => "/path/to/your/file"
}
output {
kafka {
bootstrap_servers => "127.0.0.1:9092"
topic_id => "topicname"
}
}
<强> Filebeat 强>
Filebeat与Logstash非常相似,如果您想对从文件读取的数据执行额外处理,它只提供较少的功能。此外,它是用go而不是java编写的,因此运行它的机器上的占用空间应该更小。 以下应该是一个最小的配置来启动(从内存中,如果必须添加一个或两个参数):
filebeat.prospectors:
- type: log
paths:
- /path/to/your/file
output.kafka:
hosts: ["127.0.0.1:9092"]
topic: 'topicname'
<强>水槽强>
如果您想重新访问Flume选项,请查看TaildirSource,我没有使用它,但听起来它应该非常适合您的用例。