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));