无法查询本地键值存储(Kafka-Stream)

时间:2019-10-18 05:48:31

标签: 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

方法: 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();

以上代码的结果:

A_Blue 1
A_Yellow 1
A_Red 1
A_Yellow 2
A_Yellow 3
B_Blue 1
C_Red 1
C_Red 2
B_Blue 2

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


            }
        }

4)当我尝试查询数据时,它给出的是空数据(没有输出得到打印)。

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

0 个答案:

没有答案