如何使用不断增长的文件作为Apache Kafka生成器并只读取新添加的数据

时间:2017-10-06 12:42:28

标签: apache-kafka real-time flume

我正在尝试使用file作为我的kafka制作人。源文件不断增长(比如每秒20条记录/行)。以下是与我的问题类似的帖子:

How to write a file to Kafka Producer

但在这种情况下,每次在文件中插入新行时,都会读取整个文件并将其添加到Kafka主题中。我只想将新添加的行发送到主题(即,如果文件已经存在10行,并且还有4行附加到其中,则只需要将4行发送到主题)。

有没有办法实现这个目标?

尝试了其他解决方案:

  1. 使用源类型作为'spooldir'的Apache flume。但它没有用,因为它从添加到目录的新文件中读取数据,而不是将数据附加到已读取的文件中。

  2. 我们还尝试使用flume source type 作为'exec'和命令作为'tail -F / path / file-name'。这似乎也不起作用。

  3. 欢迎使用任何其他工具的建议,因为我的目标是实时读取文件中的数据(即,我需要将数据插入文件后立即)

1 个答案:

答案 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,我没有使用它,但听起来它应该非常适合您的用例。