如何连续喂嗅到kafka的数据包?

时间:2016-03-08 16:26:13

标签: linux unix apache-kafka wireshark tshark

目前我正在从我的本地wlan界面嗅探数据包,如:

sudo tshark > sampleData.pcap

但是,我需要将此数据提供给kafka。

目前,我有一个kafka制作人脚本producer.sh

../bin/kafka-console-producer.sh --broker-list localhost:9092 --topic 'spark-kafka'

并将数据提供给kafka,如下所示:

producer.sh < sampleData.pcap

其中 sampleData.pcap 我预先捕获了IP数据包信息。

但是,我想自动完成这样的过程:

sudo tshark > http://localhost:9091
producer.sh < http://localhost:9091

这显然只是一种伪算法。我想要做的是,将嗅探数据发送到端口并让kafka持续读取它。我不希望kafka连续读取文件,因为这意味着单个文件的大量读/写操作会导致效率低下。

我搜索了互联网并遇到了 kafka-connect ,但我找不到任何有用的文档来实现这样的内容。

实现这样的事情的最佳方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:1)

使用netcat

无需编写服务器,您可以使用netcat(并告诉您的脚本监听标准输入):

shell1> nc -l 8888 | ./producer.sh
shell2> sudo tshark -l | nc 127.1 8888

tshark的-l阻止它过多地缓冲输出(每个数据包后刷新)。

使用命名管道

您还可以使用命名管道将tshark输出传输到第二个进程:

shell1> mkfifo /tmp/tsharkpipe
shell1> tail -f -c +0 /tmp/tsharkpipe | ./producer.sh
shell2> sudo tshark -l > /tmp/tsharkpipe

答案 1 :(得分:0)

我认为你可以

答案 2 :(得分:0)

如果您使用Node,则可以使用child_processkafka_node来执行此操作。像这样:

var kafka = require('kafka-node');
var client = new kafka.Client('localhost:2181');
var producer = new kafka.Producer(client);

var spawn = require('child_process').spawn;
var tshark = spawn('sudo', ['/usr/sbin/tshark']);

tshark.stdout.on('data', (data) => {
  producer.send([
    {topic: 'spark-kafka', messages: [data.split("\n")]}
  ], (err,result) => { console.log("sent to kafka")});
});

答案 3 :(得分:0)

另一种选择是使用Apache NiFi。使用NiFi,您可以执行命令并将输出传递给其他块以进行进一步处理。在这里,您可以让NiFi在本地主机上执行tshark命令,然后将输出传递给Kafka。

有一个示例here,它应该更详细地演示这种类型的方法。