Apache kafka 无法查询本地键值存储(Kafka流)

Apache kafka 无法查询本地键值存储(Kafka流),apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在处理需要查询KTable的用例(使用本地键值存储方法)。我的示例数据位于主题中: A,Blue A,Blue A,Yellow A,Red A,Yellow A,Yellow B,Blue C,Red C,Red B,Blue A Blue:2,Yellow:3,Red:1 B Blue:2 C Red:2 根据输入,我希望生成输出并存储在主题中: A,Blue A,Blue A,Yellow A,Red A,Yellow A,Yellow B,Blue C,Red C,Red B

我正在处理需要查询KTable的用例(使用本地键值存储方法)。我的示例数据位于主题中:

A,Blue
A,Blue 
A,Yellow
A,Red
A,Yellow
A,Yellow
B,Blue
C,Red
C,Red
B,Blue
A Blue:2,Yellow:3,Red:1
B Blue:2
C Red:2
根据输入,我希望生成输出并存储在主题中:

A,Blue
A,Blue 
A,Yellow
A,Red
A,Yellow
A,Yellow
B,Blue
C,Red
C,Red
B,Blue
A Blue:2,Yellow:3,Red:1
B Blue:2
C Red:2
方法: 1) 我首先通过读取Kstream中的主题数据来执行计数操作

     //set the properties for interactive queries
     props.put(StreamsConfig.APPLICATION_SERVER_CONFIG,"localhost:9092" );
        props.put(StreamsConfig.STATE_DIR_CONFIG, "D:\\Kafka_data\\Local_store");

 //read the user input from Kafka topic: data
        final KStream<String,String> userDataSource = builder.stream("data");

        final KGroupedStream<String,String> inputData = userDataSource.
                map((key, value) -> new KeyValue<>(value.split(",")[0].toString() +  "_"+ value.split(",")[1].toString() , value.split(",")[1].toString()) )
                .selectKey((s, s2) -> s)
                .groupByKey(Grouped.with(Serdes.String(),Serdes.String()));


        final KTable<String,Long> inputAggregationResult  = inputData.count();
2) 然后将结果存储在主题中:

inputAggregationResult.toStream().to("input-data-aggregation", Produced.with(Serdes.String(), Serdes.Long()));
3) 现在将主题(输入数据聚合)中的数据作为Ktable读取,以便查询

final StreamsBuilder builder = new StreamsBuilder();

KTable<String, Object> ktableInformation = builder.table("input-data-aggregation", Materialized.<String, Object, KeyValueStore<Bytes, byte[]>>as("CountsValueStore"));

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

streams.cleanUp();
 streams.start();

 ReadOnlyKeyValueStore<String, Object> keyValueStore;
        Map<String,Object> information = new LinkedHashMap<String,Object>();
        while (true) {
            try {

                // Get the key-value store CountsKeyValueStore
                 keyValueStore =
                        streams.store(ktableInformation.queryableStoreName(), QueryableStoreTypes.keyValueStore());


                //read the value
                KeyValueIterator<String, Object> range = keyValueStore.range("all", "streams");
                while (range.hasNext()) {
                    KeyValue<String, Object> next = range.next();
                    information.put(next.key,next.value);
                    System.out.println("count for " + next.key + ": " + next.value);
                }
                // close the iterator to release resources
                range.close();


            } catch (InvalidStateStoreException ignored) {
                ignored.printStackTrace();


            }
        }
final StreamsBuilder builder=new StreamsBuilder();
KTable ktableInformation=builder.table(“输入数据聚合”,物化为.as(“CountsValueStore”);
最终KafkaStreams streams=新的KafkaStreams(builder.build(),props);
streams.cleanUp();
streams.start();
ReadOnlyKeyValueStore keyValueStore;
映射信息=新建LinkedHashMap();
while(true){
试一试{
//获取键值存储CountsKeyValueStore
键值存储=
streams.store(ktableInformation.queryableStoreName(),QueryableStoreTypes.keyValueStore());
//读取值
KeyValueIterator范围=keyValueStore.range(“所有”、“流”);
while(range.hasNext()){
KeyValue next=范围。next();
information.put(next.key,next.value);
System.out.println(“计数为“+next.key+”:“+next.value”);
}
//关闭迭代器以释放资源
range.close();
}捕获(已忽略InvalidStateStoreException){
已忽略。printStackTrace();
}
}
4) 当我试图查询数据时,它给出的是空数据(没有输出得到打印)


如果我在查询本地键值存储时遗漏了任何步骤,有人可以指导我吗?或实现目标输出的任何其他替代方案。我已验证Kafka正在本地实例中写入本地键值存储数据,但在读取(查询)数据时,它给出了一个空结果。

为什么不直接查询
inputAggregationResult
?另外,商店名称正确吗?你有例外吗?您是否运行多个实例(即,您是否查询正确的碎片)?我正在使用一个带有一个代理的Kafka实例(在windows中运行)。我想将inputAggregationResult存储到java对象中以供进一步处理。我只找到了ReadOnlyKeyValueStore方法来存储来自KTable的信息。他们的另一个alertnative方法是否可以从KTable获取信息?我没有询问代理的数量,而是询问应用程序实例的数量。-你能检查一下你的申请滞后吗?也许您需要使用rest工具重置偏移?当然。我将尝试使用rest工具重置偏移量并再次运行应用程序。在这些更改之后,我将更新观察结果。