目前我正在从我的本地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 ,但我找不到任何有用的文档来实现这样的内容。
实现这样的事情的最佳方法是什么?
谢谢!
答案 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_process
和kafka_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,它应该更详细地演示这种类型的方法。