这是我从文件中读取的Kafka代码:
public void run() throws ClassNotFoundException, FileNotFoundException, IOException, ParseException{
Properties prop = new Properties();
prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.ByteArraySerializer");
prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<String, String>(prop);
String currentLine = null;
reader = new BufferedReader(new FileReader(filePath));
while((currentLine = reader.readLine()) != null){
System.out.println("---------------------");
System.out.println(currentLine);
System.out.println("---------------------");
ProducerRecord<String, String> message = new ProducerRecord<String, String>(topicName, currentLine);
producer.send(message);
}
reader.close();
producer.close();
}
但是这段代码只运行一个很明显的代码 但我有一个文件,每小时不断更新新行 如果我使用上面的代码,这将再次运行整个文件。如何只重新运行添加到文件中的新行。
答案 0 :(得分:1)
答案应取决于文件的管理方式。如果它可以旋转并且你需要处理恢复,那么Flume或tail -F(无论如何实现Flume 1.6)将不适合你。另外,你使用什么操作系统?
另一种方法可能是使用logstash或文件节拍的尾部并写入Kafka。如果您喜欢python,请查看tailcher(https://github.com/thanos/tailchaser)
答案 1 :(得分:0)
尝试使用linux管道 tail + kafkacat ,而不是编写自己的代码。
&#34; tail -F&#34;将读取文件中的新条目,管道到kafkacat并生成到&#sys;&#39; snappy压缩的主题
tail -F /var/log/syslog | kafkacat -b mybroker -t syslog -z snappy
小心使用-F而不是-f,-F能够处理日志轮换问题。 -F继续尝试打开文件,即使它已经或变得无法访问;按名称命名时很有用。
答案 2 :(得分:0)
您也可以在此处使用Apache Flume
以及Kafka
。
Flume会将数据从file
流式传输到Kafka Broker
。
请查看KafkaSink
提供的Flume
。
请查看下面的Apache Flume文档:
https://flume.apache.org/releases/content/1.6.0/apidocs/org/apache/flume/sink/kafka/KafkaSink.html