2016-03-21 4 views
1

Ich habe eine Quelle implementiert, die einen festen UDP-Port öffnet und ihn abhört. Also, ich möchte genau eine Quelle pro Task-Manager ausführen (in meinem Fall führe ich einen Task-Manager pro Knoten), weil übermäßig eine Exception java.net.BindException: Address already in use ausgelöst wird.Wie wird eine Quelle pro Task-Manager (oder pro Knoten) ausgeführt?

Ich bemerke dieses Problem, wenn Test HA von Apache Flink. Als ich einen Task-Manager heruntergefahren habe, hat der Apache Flick versucht, zwei Quellen mit demselben Port auf einem Knoten laufen zu lassen.

So, wie genau eine Quelle pro Task-Manager (oder pro Cluster-Knoten) ausführen?

+0

Haben Sie versucht mit der Einstellung der Parallelität auf die Anzahl der Knoten, die Sie haben? – Chobeat

+0

Wie wird es dynamisch gemacht (basierend auf Anzahl Task-Manager oder Knoten)? –

+0

Aus dem doc: "Die Standardparallelität kann für einen gesamten Job durch Aufruf von setParallelism (int parallelism) in der ExecutionEnvironment oder durch Übergabe von -p an das Flink Kommandozeilen-Frontend überschrieben werden. Sie kann durch Aufruf von setParallelism für einzelne Transformationen überschrieben werden (int parallelism) auf einem Operator. Weitere Informationen zur Parallelität finden Sie im Programmierhandbuch. " – Chobeat

Antwort

1

Es ist derzeit nicht möglich, dynamisch zu erzwingen, dass genau ein Task einer Art auf jedem TaskManager ausgeführt wird. Sie können vermeiden, dass mehrere Quellaufgaben auf demselben Computer geplant werden, indem Sie die Anzahl der Steckplätze auf 1 festlegen. Wenn Sie jedoch eine Maschine verlieren und keine freie TaskManager haben, haben Sie nicht genug Steckplätze, um den Job neu zu starten.

Alternativ könnten Sie Ihre Quellen so schreiben, dass sie widerstandsfähiger sind. Sie können beispielsweise eine Quelle einfach stoppen, wenn sie nicht an den angegebenen Port binden können. Da kein anderes Programm an den Port gebunden werden kann, wissen Sie, dass bereits eine andere Quellaufgabe Daten von diesem Port verarbeitet.

+0

Ich sehe ein Problem in der ersten Lösung: Source kann auf jedem Task-Manager/Knoten gestartet werden, aber ich kann Daten nur an einen Knoten (Aktiv/Master-Knoten) des Clusters senden. Also, zweite Lösung ist interessanter, aber ich habe eine Frage: 1) Könnten Sie bitte erklären, was bedeutet "Stop-Source"? Wie kann man die Quelle stoppen? 2) Wie ich verstehe, wird AF versuchen, die angehaltene Quelle neu zu starten. Recht? Also, in diesem Fall wird AF den Fluss pereodisch neu starten. Recht? –

+1

Lassen Sie einfach die 'run'-Funktion. Dies wird die Aufgabe beenden. Sie können also versuchen, einen Socket zu öffnen, und wenn das fehlschlägt, dann lassen Sie die 'run'-Methode. –

+0

Ich habe es getestet. Scheint alles funktioniert gut. Vielen Dank. –

Verwandte Themen