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
Java Kafka流聚合有状态物联网数据_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java Kafka流聚合有状态物联网数据

Java Kafka流聚合有状态物联网数据,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我有汽车的输入数据,想为旅行创建一个新的事件。我从车辆事件主题中得到以下json消息: { asset_id: ‘123’, location: [11.00, 12.00], journey_start: true } { asset_id: ‘123’, location: [12.00, 12.00] } { asset_id: ‘123’, location: [13.00, 12.00], journey_end: true } 从旅程事件开始到旅程事件结束,它应该收集位置,如果旅程

我有汽车的输入数据,想为旅行创建一个新的事件。我从车辆事件主题中得到以下json消息:

{ asset_id: ‘123’, location: [11.00, 12.00], journey_start: true }
{ asset_id: ‘123’, location: [12.00, 12.00] }
{ asset_id: ‘123’, location: [13.00, 12.00], journey_end: true }
从旅程事件开始到旅程事件结束,它应该收集位置,如果旅程结束,它应该发送到旅程事件主题。对于上一个示例,消息应该是

{ asset_id: ‘123’, locations: [[11.00, 12.00], [12.00, 12.00], [13.00, 12.00]] }
一旦有一个新的旅程开始事件,它应该从本地商店中丢弃以前的旅程事件

这就是我目前所拥有的。我不知道如何进行聚合,添加条件以推送到旅程事件主题,并删除旧的位置数据:

public class Stream {
    public static void main(String[] args) {
        Properties config = new Properties();
        config.put(StreamsConfig.APPLICATION_ID_CONFIG, "stream");
        config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        config.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE);

        final Serializer<JsonNode> jsonSerializer = new JsonSerializer();
        final Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
        final Serde<JsonNode> jsonSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);

        StreamsBuilder builder = new StreamsBuilder();
        KStream<String, JsonNode> vehicleEvent = builder.stream(
            "vehicle-event",
            Consumed.with(
                Serdes.String(),
                jsonSerde
            )
        );

        KStream<String, JsonNode> journeyEvent = vehicleEvent
            .groupBy((key, value) -> {
                JSONObject jsonObj = new JSONObject(value);
                return jsonObj.getString("asset_id");
            })
            .aggregate()


    Topology topology = builder.build();
    KafkaStreams streams = new KafkaStreams(topology, config);
    streams.start();
}
公共类流{
公共静态void main(字符串[]args){
属性配置=新属性();
config.put(StreamsConfig.APPLICATION_ID_config,“stream”);
config.put(StreamsConfig.BOOTSTRAP_SERVERS_config,“localhost:9092”);
config.put(ConsumerConfig.AUTO_OFFSET_RESET_config,“最早”);
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_config,Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_config,Serdes.String().getClass());
config.put(StreamsConfig.PROCESSING\u guarance\u config,StreamsConfig.justice\u ONCE);
最终序列化程序jsonSerializer=新的jsonSerializer();
最终反序列化程序jsonDeserializer=新的jsonDeserializer();
final-Serde-jsonSerde=Serdes.serdeFrom(jsonSerializer、jsonSerializer);
StreamsBuilder builder=新的StreamsBuilder();
KStream vehicleEvent=builder.stream(
“车辆事件”,
消耗(
Serdes.String(),
杰森塞德
)
);
KStream journeyEvent=车辆通风
.groupBy((键、值)->{
JSONObject jsonObj=新的JSONObject(值);
返回jsonObj.getString(“资产id”);
})
.aggregate()
拓扑=builder.build();
KafkaStreams streams=新的KafkaStreams(拓扑,配置);
streams.start();
}

}

一旦使用了
聚合
,通过分组方式获得的
KGroupedStream
将成为
KTable
。在这种情况下,您将不需要任何额外的处理来管理您提到的条件推送,因为在这种情况下,
KTable
充当变更日志,并且状态存储中的物化视图将只保留每个键的最新(滚动)聚合(根据此处的
aggregate
方法文档,第三个参数为
Materialized
)。DSL不支持您想要执行的操作。您需要使用处理器API,该API允许在状态处理方面具有更大的灵活性。一旦您使用了
aggregate
,通过分组得到的
KGroupedStream
将成为
KTable
。在这种情况下,您将不需要任何额外的处理来管理条件pu您提到过,因为
KTable
在本例中充当变更日志,并且状态存储中的物化视图将只保留每个键的最新(滚动)聚合(根据此处的
aggregate
方法文档,其中
物化
作为第三个参数:)。DSL不支持您想要执行的操作。您需要使用处理器API,以便在状态处理方面具有更大的灵活性。