简体   繁体   English

线程“main”org.apache.kafka.streams.errors.InvalidStateStoreException 中的异常:

[英]Exception in thread "main" org.apache.kafka.streams.errors.InvalidStateStoreException:

I am trying to access the inMemoryStore that I am creating with in the same java program.我正在尝试访问我在同一个 java 程序中创建的 inMemoryStore。 But returning a exception as "Exception in thread "main" org.apache.kafka.streams.errors.InvalidStateStoreException: The state store, storeName, may have migrated to another instance."但是返回异常为“线程“main”中的异常 org.apache.kafka.streams.errors.InvalidStateStoreException:状态存储 storeName 可能已迁移到另一个实例。

When I am using the persistentKeyValueStore it is working fine and able to create the store and return the values.当我使用persistentKeyValueStore 时,它​​工作正常并且能够创建存储并返回值。

package com.bakdata.streams_store.demo;

import java.util.Collection;
import java.util.Properties;

import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.state.KeyValueBytesStoreSupplier;
import org.apache.kafka.streams.state.KeyValueStore;
import org.apache.kafka.streams.state.QueryableStoreTypes;
import org.apache.kafka.streams.state.ReadOnlyKeyValueStore;
import org.apache.kafka.streams.state.StoreBuilder;
import org.apache.kafka.stre7ams.state.Stores;
import org.apache.kafka.streams.state.StreamsMetadata;

public class InMemoryStore {

public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    props.put(StreamsConfig.APPLICATION_ID_CONFIG, "stream-id-0001");
    props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
    props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());

    String storeName = "sample";
    KeyValueBytesStoreSupplier stateStore = Stores.inMemoryKeyValueStore(storeName);
    StoreBuilder<KeyValueStore<String, String>> storeBuilder = Stores.keyValueStoreBuilder(stateStore, Serdes.String(), Serdes.String());

    StreamsBuilder builder = new StreamsBuilder();
    builder.addStateStore(storeBuilder);
    KStream<String, String> inputStream = builder.stream("material_test1");
    KafkaStreams streams = new KafkaStreams(builder.build(), props);

    try {
        streams.start();
        Thread.sleep(30000);
    } catch (final Throwable e) {
        System.exit(1);
    }
    final ReadOnlyKeyValueStore<String, String> keyValueStore = streams.store(storeName, QueryableStoreTypes.keyValueStore());
    KeyValueIterator<String, String> range = keyValueStore.all();
    while (range.hasNext()) {
        KeyValue<String, String> next = range.next();
        System.out.println("Key: " + next.key + ", value: " + next.value);
    }
}
}

Exception in thread "main" org.apache.kafka.streams.errors.InvalidStateStoreException: The state store, sample, may have migrated to another instance.线程“main”org.apache.kafka.streams.errors.InvalidStateStoreException 中的异常:状态存储示例可能已迁移到另一个实例。 at org.apache.kafka.streams.state.internals.QueryableStoreProvider.getStore(QueryableStoreProvider.java:62) at org.apache.kafka.streams.KafkaStreams.store(KafkaStreams.java:1067) at com.bakdata.streams_store.demo.InMemoryStore.main(InMemoryStore.java:59)在 org.apache.kafka.streams.state.internals.QueryableStoreProvider.getStore(QueryableStoreProvider.java:62) 在 org.apache.kafka.streams.KafkaStreams.store(KafkaStreams.java:1067) 在 com.bakdata.streams_store.demo .InMemoryStore.main(InMemoryStore.java:59)

I am expecting to print the values from the ReadOnlyStoreQuery.我希望打印 ReadOnlyStoreQuery 中的值。

You cannot have a StateStore on a stream as there could be multiple values for a single key.流上不能有 StateStore,因为单个键可能有多个值。 You need to turn it into a KTable ( streams.table(...) ) or GlobalKtable ( streams.globalTable(...) ) first.您需要先将其转换为 KTable( streams.table(...) )或 GlobalKtable( streams.globalTable(...) )。

Kotlin example:科特林示例:

val businessObjects = streamsBuilder.globalTable("topic", eventStore("store-name"))

where eventStore is:其中eventStore是:

fun eventStore(name: String) = Materialized.`as`<String, String>(Stores.inMemoryKeyValueStore(name))
    .withKeySerde(Serdes.String())
    .withValueSerde(Serdes.String())

after you started the streams:启动流后:

var store: ReadOnlyKeyValueStore<String, String> = streams.store("store-name", keyValueStore<String, String>())

Note: There is also an interface KafkaStreams.StateListener for when the streams are ready注意:当流准备好时,还有一个接口KafkaStreams.StateListener

 override fun onChange(newState: KafkaStreams.State?, oldState: KafkaStreams.State?) =
    Option.fromNullable(newState)
        .filter { REBALANCING == oldState && RUNNING == it }
        .map { store = streams.store("store-name", keyValueStore<String, String>()) }
        .getOrElse { log.info("Waiting for Kafka being in REBALANCING -> RUNNING, but it is $oldState -> $newState") }

Alternatively you also could turn your stream into a KTable with或者,您也可以将您的流转换为KTable

stream.groupByKey().reduce(...)

like described here .就像这里描述的那样。

暂无
暂无

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

相关问题 线程“StreamThread-1”中的异常org.apache.kafka.streams.errors.StreamsException:无法重新平衡 - Exception in thread “StreamThread-1” org.apache.kafka.streams.errors.StreamsException: Failed to rebalance Kafka 流异常:org.apache.kafka.streams.errors.StreamsException - 反序列化异常处理程序 - Kafka streams Exception: org.apache.kafka.streams.errors.StreamsException - Deserialization exception handler Spark和Kafka问题-线程“ main”中的异常java.lang.NoClassDefFoundError:org.apache.spark.streaming.kafka010.LocationStrategies - Spark and Kafka issue - Exception in thread “main” java.lang.NoClassDefFoundError: org.apache.spark.streaming.kafka010.LocationStrategies 线程“主”中的异常org.apache.velocity.exception.VelocityException - Exception in thread “main” org.apache.velocity.exception.VelocityException 线程“main”org.owasp.esapi.errors.ConfigurationException 中的异常: - Exception in thread "main" org.owasp.esapi.errors.ConfigurationException: 错误 org.apache.kafka.common.utils.KafkaThread - 线程 &#39;kafka-producer-network-thread 中未捕获的异常 - ERROR org.apache.kafka.common.utils.KafkaThread - Uncaught exception in thread 'kafka-producer-network-thread 除了线程“main”org.apache.kafka.common.KafkaException:无法构建kafka消费者 - Except in thread "main" org.apache.kafka.common.KafkaException: Failed to construct kafka consumer org.apache.kafka.streams.errors.StreamsException:序列化器(键:BytesSerializer/值:BytesSerializer)与实际键不兼容 - org.apache.kafka.streams.errors.StreamsException: A serializer (key: BytesSerializer / value: BytesSerializer) is not compatible to the actual key kafka 流异常找不到 org.apache.kafka.common.serialization.Serdes$WrapperSerde 的公共无参数构造函数 - kafka streams exception Could not find a public no-argument constructor for org.apache.kafka.common.serialization.Serdes$WrapperSerde 线程“JavaFX 应用程序线程”中的 JavaFx 异常 线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/log4j/Logger - JavaFx Exception in thread "JavaFX Application Thread" Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM