Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用KStreams将Kafka主题中的数据写入文件?_Java_Apache Kafka_Kafka Consumer Api_Apache Kafka Streams - Fatal编程技术网

Java 如何使用KStreams将Kafka主题中的数据写入文件?

Java 如何使用KStreams将Kafka主题中的数据写入文件?,java,apache-kafka,kafka-consumer-api,apache-kafka-streams,Java,Apache Kafka,Kafka Consumer Api,Apache Kafka Streams,我正在尝试使用Java在Eclipse中创建一个KStream应用程序。现在,我指的是互联网上可用于KStreams的单词计数程序,并对其进行了修改 我想要的是,我从输入主题中读取的数据应该写入文件,而不是写入另一个输出主题 但是,当我试图将KStream/KTable打印到本地文件时,我在输出文件中得到以下条目: org.apache.kafka.streams.kstream.internals.KStreamImpl@4c203ea1 如何实现将输出从KStream重定向到文件 代码如下

我正在尝试使用Java在Eclipse中创建一个KStream应用程序。现在,我指的是互联网上可用于KStreams的单词计数程序,并对其进行了修改

我想要的是,我从输入主题中读取的数据应该写入文件,而不是写入另一个输出主题

但是,当我试图将KStream/KTable打印到本地文件时,我在输出文件中得到以下条目:

org.apache.kafka.streams.kstream.internals.KStreamImpl@4c203ea1
如何实现将输出从KStream重定向到文件

代码如下:

package KStreamDemo.kafkatest;

package org.apache.kafka.streams.examples.wordcount;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KTable;
import org.apache.kafka.streams.kstream.KeyValueMapper;
import org.apache.kafka.streams.kstream.Produced;
import org.apache.kafka.streams.kstream.ValueMapper;

import java.util.Arrays;
import java.util.Locale;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
public class TemperatureDemo {
public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    props.put(StreamsConfig.APPLICATION_ID_CONFIG, "streams-wordcount");
    props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "34.73.184.104:9092");
    props.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 0);
    props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
    props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
    System.out.println("#1###################################################################################################################################################################################");
    // setting offset reset to earliest so that we can re-run the demo code with the same pre-loaded data
    // Note: To re-run the demo, you need to use the offset reset tool:
    // https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Application+Reset+Tool
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

    StreamsBuilder builder = new StreamsBuilder();
    System.out.println("#2###################################################################################################################################################################################");
    KStream<String, String> source = builder.stream("iot-temperature");
    System.out.println("#5###################################################################################################################################################################################");
    KTable<String, Long> counts = source
        .flatMapValues(new ValueMapper<String, Iterable<String>>() {
            @Override
            public Iterable<String> apply(String value) {
                return Arrays.asList(value.toLowerCase(Locale.getDefault()).split(" "));
            }
        })
        .groupBy(new KeyValueMapper<String, String, String>() {
            @Override
            public String apply(String key, String value) {
                return value;
            }
        })
        .count();
    System.out.println("#3###################################################################################################################################################################################");
    System.out.println("OUTPUT:"+ counts);
    System.out.println("#4###################################################################################################################################################################################");
    // need to override value serde to Long type
    counts.toStream().to("iot-temperature-max", Produced.with(Serdes.String(), Serdes.Long()));

    final KafkaStreams streams = new KafkaStreams(builder.build(), props);
    final CountDownLatch latch = new CountDownLatch(1);

    // attach shutdown handler to catch control-c
    Runtime.getRuntime().addShutdownHook(new Thread("streams-wordcount-shutdown-hook") {
        @Override
        public void run() {
            streams.close();
            latch.countDown();
        }
    });

    try {
        streams.start();
        latch.await();
    } catch (Throwable e) {
        System.exit(1);
    }
    System.exit(0);
}
}这是不正确的

System.out.println("OUTPUT:"+ counts);
您需要执行counts.foreach,然后将消息打印到文件中

只需更新以写入文件即可

但是,最好将流写入主题。并使用Kafka Connect将数据写入文件。这是一种更符合行业标准的模式。鼓励Kafka Streams仅在Kafka内的主题之间移动数据,而不与外部系统或文件系统集成

使用所需的主题信息编辑connect-file-sink.properties,然后

bin/connect-standalone config/connect-file-sink.properties

为什么要将其写入文件?通常应用程序会直接从主题中使用。文件会带来各种您不希望出现的问题,Kafka主题可以通过各种方式使用,包括本机API、REST API等。谢谢。但是,我当前的用例是按键分割输入的JSON数据,并根据键将其写入不同的文件。我不希望编写自定义连接,而是希望通过KStreams代码实现它。