Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Apache kafka 使用Kafka流聚合流数据_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka 使用Kafka流聚合流数据

Apache kafka 使用Kafka流聚合流数据,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在用这样的代码向卡夫卡发送消息: Properties=newproperties(); put(“bootstrap.servers”,“localhost:9092”); 道具放置(“阿克斯”、“全部”); 道具放置(“重试”,0); 道具放置(“批量大小”,16384); 道具放置(“玲儿小姐”,1); props.put(“buffer.memory”,33554432); put(“key.serializer”、“org.apache.kafka.common.serializa

我正在用这样的代码向卡夫卡发送消息:

Properties=newproperties();
put(“bootstrap.servers”,“localhost:9092”);
道具放置(“阿克斯”、“全部”);
道具放置(“重试”,0);
道具放置(“批量大小”,16384);
道具放置(“玲儿小姐”,1);
props.put(“buffer.memory”,33554432);
put(“key.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
put(“value.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
props.put(StreamsConfig.APPLICATION_ID_CONFIG,“testo”);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“最早”);
制作人=新卡夫卡制作人(道具);
对于(int i=0;i<1000;i++){
生产商。发送(新生产商记录)(
“托皮科”,
String.format(“{“type\”:“test\”,“t\”:%.3f,\“k\”:%d}”,System.nanoTime()*1e-9,i));
}
我想用Kafka Streams(0.10.0.1)计算过去一小时内的邮件总数。我试过:

final KStreamBuilder builder=new KStreamBuilder();
最终KStream metrics=builder.stream(Serdes.String(),Serdes.String(),“topico”);
metrics.countByKey(TimeWindows.of(“Hourly”,3600*1000)).mapValues(Object::toString).to(“output”);

我对卡夫卡/溪流很陌生。我怎么做呢?

首先。。您缺少此代码来实际启动流式处理

KafkaStreams streams = new KafkaStreams(builder, config);   
streams.start();    
Runtime.getRuntime().addShutdownHook(new Thread(streams::close)); 

要聚合两个流,可以使用join方法。 kstreams中有可用的

例如:如果您想加入
kstream
ktable

KStream<String, String> left = builder.stream("topic1");
KTable<String, String> right = builder.table("topic2");

left.leftjoin((right, (leftValue, rightValue) -> Customfunction(rightValue, leftValue))

我对kafka streams也很陌生,我不知道旧的api,但是有了新的api(2.1.x),类似这样的东西应该可以工作

 kstream.mapValues((readOnlyKey, value) -> "test")
                    .groupByKey()
                    .windowedBy(TimeWindows.of(1000 * 60))
                    .count()
                    .toStream()
                    .selectKey((key, value) -> Instant.ofEpochMilli(key.window().end())
                            .truncatedTo(ChronoUnit.HOURS).toEpochMilli())
                    .groupByKey(Serialized.with(Serdes.Long(), Serdes.Long())).reduce((reduce, newVal) -> reduce + newVal)
                    .toStream().peek((key, value) -> log.info("{}={}",key,value));

如果您能给出一个包含输入、输出和预期输出的数据示例,这将非常有用。代码似乎很好。不确定您面临的问题是什么。另外,您面临的错误/问题是什么?你的问题中没有提到。我确实看到您共享的一点点代码存在一些问题,但在得出过早的结论之前,正如Matthias J.Sax所说,如果您能够共享更多信息,尤其是关于卡夫卡流相关代码的信息,这将有所帮助:1。您定义的与Kafka Streams相关的配置设置,以及2。完整的拓扑定义等,包括通过类似
KafkaStreams#start()
的方式实际启动拓扑的部分。
 kstream.mapValues((readOnlyKey, value) -> "test")
                    .groupByKey()
                    .windowedBy(TimeWindows.of(1000 * 60))
                    .count()
                    .toStream()
                    .selectKey((key, value) -> Instant.ofEpochMilli(key.window().end())
                            .truncatedTo(ChronoUnit.HOURS).toEpochMilli())
                    .groupByKey(Serialized.with(Serdes.Long(), Serdes.Long())).reduce((reduce, newVal) -> reduce + newVal)
                    .toStream().peek((key, value) -> log.info("{}={}",key,value));