Ich habe 2 JavaPairDStreams. Sie haben denselben Schlüssel (Typ und Wert) und denselben Werttyp (anderer Wert). Ich brauche sie, um den gleichen Status zu teilen, um ein Ergebnis basierend auf dem aktuellen Status zurückzugeben, also verwende ich die gleiche mapWithState-Funktion.Same mapWithState Funktion von mehreren JavaDStreams verwendet
JavaPairDStream<String, String> inputMessagesStream = readFromKafkaStream1();
JavaPairDStream<String, String> inputMessagesStream2 = readFromKafkaStream();
Function3<String, Optional<String>, State<MessageState>, String> messageState = (key, value, state) -> {
if (state.exists()) {
return state.get().process(value.get());
} else {
MessageState ms = new MessageState();
ms.process(value.get());
state.update(ms);
return null;
}
};
JavaMapWithStateDStream<String, String, MessageState, String> message1 = inputMessagesStream.mapWithState(StateSpec.function(messageState));
JavaMapWithStateDStream<String, String, MessageState, String> message2 = inputMessagesStream2.mapWithState(StateSpec.function(messageState));
Ist es in Ordnung, die gleiche Funktion für 2 verschiedene Streams zu verwenden? Wird der Status von jedem Stream korrekt aktualisiert und geteilt?
Nur um sicher zu sein, dass ich die Antwort undestrood: Obwohl die mapWithState Funktion kann für mehr JavaPairDStreams verwendet wird, wird der Staat Objekt zwischen den Strömen geteilt. Jeder Stream hat seinen eigenen Status obj, richtig? – Vlad
Streams haben im Allgemeinen keine "State Objects". 'mapWithState' erzeugt eine spezielle Art von Stream, der Zustandsobjekte besitzt (eines für jeden Schlüssel). Wenn Sie sie zweimal aufrufen, werden natürlich Streams mit separatem Status erstellt (selbst wenn Sie sie zweimal in einem einzelnen Stream aufrufen). –