如何使用Kafka从文件中读取新的entires

时间:2016-05-21 19:57:58

标签: hadoop apache-kafka kafka-producer-api

这是我从文件中读取的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();   
}  

但是这段代码只运行一个很明显的代码 但我有一个文件,每小时不断更新新行 如果我使用上面的代码,这将再次运行整个文件。如何只重新运行添加到文件中的新行。

3 个答案:

答案 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