Sam*_*amy 3 apache-kafka-streams
对于我的一个Kafka流应用程序,我需要使用DSL和Processor API的功能.我的流媒体应用流程是
source -> selectKey -> filter -> aggregate (on a window) -> sink
Run Code Online (Sandbox Code Playgroud)
在聚合之后,我需要向接收器发送SINGLE聚合消息.所以我将拓扑定义如下
KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> source = builder.stream(source_stream);
source.selectKey(new MyKeyValueMapper())
.filterNot((k,v) -> k.equals("UnknownGroup"))
.process(() -> new MyProcessor());
Run Code Online (Sandbox Code Playgroud)
我定义了一个自定义StateStore并将其注册到我的处理器,如下所示
public class MyProcessor implements Processor<String, String> {
private ProcessorContext context = null;
Serde<HashMapStore> invSerde = Serdes.serdeFrom(invJsonSerializer, invJsonDeserializer);
KeyValueStore<String, HashMapStore> invStore = (KeyValueStore) Stores.create("invStore")
.withKeys(Serdes.String())
.withValues(invSerde)
.persistent()
.build()
.get();
public MyProcessor() {
}
@Override
public void init(ProcessorContext context) {
this.context = context;
this.context.register(invStore, false, null); // register the store
this.context.schedule(10 * 60 * 1000L);
}
@Override
public void process(String partitionKey, String message) {
try {
MessageModel smb = new MessageModel(message);
HashMapStore oldStore = invStore.get(partitionKey);
if (oldStore == null) {
oldStore = new HashMapStore();
}
oldStore.addSmb(smb);
invStore.put(partitionKey, oldStore);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void punctuate(long timestamp) {
// processes all the messages in the state store and sends single aggregate message
}
@Override
public void close() {
invStore.close();
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,我明白了 java.lang.NullPointerException
org.apache.kafka.streams.process.internals.ProcessorStateManager中org.apache.kafka.streams.state.internals.MeteredKeyValueStore.flush(MeteredKeyValueStore.java:167)中的线程"StreamThread-18"java.lang.NullPointerException中的异常.flush(ProcessorStateManager.java:322)org.apache.kafka.streams.processtern.StreamTask.com(StreamTask.java:252)org.apache.kafka.streams.processor.internals.StreamThread.commitOne(StreamThread) .java:446)org.apache.kafka.streams.processor.internals.StreamThread.commitAll(StreamThread.java:434)at org.apache.kafka.streams.processor.internals.StreamThread.maybeCommit(StreamThread.java:422) )org.apache.kafka.stream.process.hunop(.StatThread.run:Runor.Interals.StreamThread.run上的org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:340).(StreamThread.java:218)
知道这里出了什么问题吗?
Mat*_*Sax 12
您需要使用(或在旧版本中)在您的处理器外注册您的商店.首先创建存储,然后将其注册到(),并在添加处理器时提供存储名称以连接处理器和存储.StreamsBuilderKStreamBuilderStreamsBuilderKStreamBuilder
StreamsBuilder builder = new StreamsBuilder();
// create store
StoreBuilder storeBuilder = Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore("invStore"),
Serdes.String(),
invSerde));
// register store
builder.addStateStore(storeBuilder);
KStream<String, String> source = builder.stream(source_stream);
source.selectKey(new MyKeyValueMapper())
.filterNot((k,v) -> k.equals("UnknownGroup"))
.process(() -> new MyProcessor(), "invStore"); // connect store to processor by providing store name
// older API:
KStreamBuilder builder = new KStreamBuilder();
// create store
StateStoreSupplier storeSupplier = (KeyValueStore)Stores.create("invStore")
.withKeys(Serdes.String())
.withValues(invSerde)
.persistent()
.build();
// register store
builder.addStateStore(storeSupplier);
KStream<String, String> source = builder.stream(source_stream);
source.selectKey(new MyKeyValueMapper())
.filterNot((k,v) -> k.equals("UnknownGroup"))
.process(() -> new MyProcessor(), "invStore"); // connect store to processor by providing store name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4324 次 |
| 最近记录: |