Apache Flink vs Apache Spark как платформы для крупномасштабного машинного обучения?

Можно ли сравнить Flink и Spark как платформы для машинного обучения? Что потенциально лучше для итеративных алгоритмов? Ссылка на общее обсуждение Flink vs Spark: В чем разница между Apache Spark и Apache Flink?

Ответ 1

Отказ от ответственности: я член PMC Apache Flink. Мой ответ фокусируется на различиях в выполнении итераций в Flink и Spark.

Apache Spark выполняет итерации путем циклического разворота. Это означает, что для каждой итерации запланирован и выполнен новый набор задач/операторов. Spark делает это очень эффективно, потому что он очень хорош при планировании задач с малой задержкой (тот же механизм используется для потоковой передачи Spark) и кэширует данные в памяти по итерациям. Поэтому каждая итерация работает на результат предыдущей итерации, которая хранится в памяти. В Spark итерации выполняются как обычные for-loops (см. Пример логистической регрессии).

Flink выполняет программы с итерациями как циклические потоки данных. Это означает, что программа потока данных (и все ее операторы) назначается только один раз, и данные возвращаются из хвоста итерации в ее голову. В принципе, данные текут циклами вокруг операторов в рамках итерации. Поскольку операторы только что запланированы один раз, они могут поддерживать состояние по всем итерациям. API Flink предлагает два специализированных оператора итераций для указания итераций: 1) массовые итерации, которые концептуально похожи на разворот цикла и 2) дельта-итерации. Итерации Delta могут значительно ускорить определенные алгоритмы, поскольку работа на каждой итерации уменьшается с увеличением количества итераций. Например, 10-я итерация реализации PageRank с дельта-итерацией выполняется намного быстрее, чем первая итерация.