DAG (направленный ациклический граф) выполнение больших данных является обычным явлением. Мне интересно, как Apache Flink реализует итерации, учитывая, что граф может быть циклическим.
Как Apache Flink реализует итерацию?
Ответы (1)
Если Flink выполняет итерационные программы, граф потока данных не является DAG, но допускает циклы. Однако эти циклы не являются произвольными и должны следовать определенному шаблону, чтобы позволить Flink до некоторой степени управлять этим циклическим потоком.
В других системах часто нет строгих технических причин для отказа от поддержки циклов. Разрешение циклов общим способом обычно запрещено, потому что это может привести к бесконечному циклу (т. Е. Кортеж вращает цикл бесконечно, а программа не завершается).
Flink отслеживает цикл, подсчитывая количество итераций. Таким образом, Flink может отслеживать, какие кортежи к каким итерациям принадлежат, и может, например, избежать того, чтобы кортежи из новой итерации «переняли» кортежи из более старой. Кроме того, он позволяет Flink определять, равны ли результаты итераций n
и n+1
. Равный результат означает завершенное вычисление, позволяющее Flink прервать бесконечный цикл и завершить его (это справедливо для так называемых итераций с фиксированной точкой).
Подробную информацию можно найти в этом исследовательском документе: https://dl.acm.org/citation.cfm?id=2350245
Использование итерации в вашей программе описано здесь: https://ci.apache.org/projects/flink/flink-docs-release-0.10/apis/programming_guide.html#iteration-operators