繁体   English   中英

在Kafka Streams中查询全局状态存储会引发Null异常

[英]Querying a Global State Store in Kafka Streams throws a Null exception

使用Processor API和addGlobalStore函数创建全局KTable时,结果存储将填充OK。 但是随后尝试遍历商店的内容会导致以下异常:

Exception in thread "main" java.lang.NullPointerException                                                                                                             at org.apache.kafka.streams.state.internals.SerializedKeyValueIterator.next(SerializedKeyValueIterator.java:63)                                               at org.apache.kafka.streams.state.internals.SerializedKeyValueIterator.next(SerializedKeyValueIterator.java:26)                                               at org.apache.kafka.streams.state.internals.MeteredKeyValueStore$MeteredKeyValueIterator.next(MeteredKeyValueStore.java:208)                                  at org.apache.kafka.streams.state.internals.MeteredKeyValueStore$MeteredKeyValueIterator.next(MeteredKeyValueStore.java:189)                                  at org.apache.kafka.streams.state.internals.CompositeReadOnlyKeyValueStore$CompositeKeyValueIterator.next(CompositeReadOnlyKeyValueStore.java:155)            at org.apache.kafka.streams.state.internals.CompositeReadOnlyKeyValueStore$CompositeKeyValueIterator.next(CompositeReadOnlyKeyValueStore.java:113)            at org.apache.kafka.streams.state.internals.DelegatingPeekingKeyValueIterator.hasNext(DelegatingPeekingKeyValueIterator.java:63)

这来自遍历商店的简单代码:

ReadOnlyKeyValueStore<String, StreamConfig> store = this.globalStreams.store("config-table",QueryableStoreTypes.<String, Config>keyValueStore());
final KeyValueIterator<String, Config> iteratble = store.all();
HashMap<String, Config> dynamicStreams = new HashMap<String,Config>();
while (iteratble.hasNext()) {
    final KeyValue<String, Config> next = iteratble.next();
    dynamicStreams.put(next.key, next.value);
}
iteratble.close();

对该存储中条目的任何访问都会导致该异常。 如果我使用globalTable函数创建全局状态存储,则相同的主题也可以正常工作(因此,这不是反序列化问题)。 状态存储还成功返回行数(因此完全填充)。

全局状态存储的创建过程如下,使用的是Kafka Streams 0.10.2.1。

KStreamBuilder globalBuilder = new KStreamBuilder();
StateStoreSupplier<KeyValueStore<String, Config>> storeSupplier = Stores
    .create("config-table")
    .withKeys(Serdes.String())
    .withValues(configSerdes)
    .persistent()
    .build();

// a Processor that updates the store
ProcessorSupplier<String, Config> procSupplier = () -> new ConfigWorker();
globalBuilder.addGlobalStore(
    storeSupplier.get(), 
    "config-table-source", 
    new StringDeserializer(),
    configDeserializer, 
    "config", 
    "config-worker", 
    procSupplier)
    .buildGlobalStateTopology();

this.globalStreams = new KafkaStreams(
    globalBuilder, 
    this.getProperties());
globalStreams.start();

编辑:

  • 一个问题是,默认情况下会记录状态存储,并且更改日志不支持全局KTable。 因此,在状态存储创建中添加.disableLogging可以解决此问题。

  • 另一个问题似乎是在处理程序的init函数中调用context.schedule 这引发了无效操作异常。 删除此固定的代码,但我想现在从未调用过punctuate 它现在似乎可以正常工作-但尚不清楚为什么我不能打电话给schedule

根据此代码 ,似乎不允许在全局上下文中转发。 因此,我的全局处理器只需要处理入站更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM