2016-08-23 2 views
0

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?

Antwort

0

Ja. Diese Funktion schließt nicht über State (oder irgendetwas anderes), es bekommt es als Argument. Also werden diese beiden Verwendungen unterschiedliche Zustände von verschiedenen Datenströmen erhalten: mapWithState.

+0

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

+0

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). –

Verwandte Themen