Apache Flink 与 Apache Spark 作为大规模机器学习的平台?

Apache Flink vs Apache Spark as platforms for large-scale machine learning?

有人可以将 Flink 和 Spark 作为机器学习平台进行比较吗?哪种迭代算法可能更好? Link Flink 与 Spark 的一般讨论:What is the difference between Apache Spark and Apache Flink?

免责声明:我是 Apache Flink 的 PMC 成员。我的回答集中在 Flink 和 Spark 中执行迭代的区别。

Apache Spark 通过循环展开执行迭代。这意味着对于每次迭代,都会安排并执行一组新的 tasks/operators。 Spark 非常有效地做到这一点,因为它非常擅长低延迟任务调度(顺便说一句,Spark 流使用相同的机制。)并且跨迭代在内存中缓存数据。因此,每次迭代都对保存在内存中的前一次迭代的结果进行操作。在 Spark 中,迭代是作为常规 for 循环实现的(参见 Logistic Regression example)。

Flink 以循环数据流的形式迭代执行程序。这意味着数据流程序(及其所有运算符)仅被调度一次,并且数据从迭代的尾部反馈到其头部。基本上,数据在迭代中围绕运算符循环流动。由于运算符仅被调度一次,因此它们可以在所有迭代中保持状态。 Flink 的 API 提供了两个专用的 iteration operators to specify iterations: 1) bulk iterations, which are conceptually similar to loop unrolling, and 2) delta iterations。 Delta 迭代可以显着加快某些算法的速度,因为随着迭代次数的增加,每次迭代中的工作量会减少。例如,增量迭代 PageRank 实现的第 10 次迭代比第一次迭代快得多。

根据我在 ML 和数据流处理方面的经验。 Flink 和 Spark 擅长的领域不同,在 ML 场景中可以互补。 Flink 能够胜任在线学习任务,在该任务中,我们通过消耗新事件不断更新部分模型,同时进行实时推理。并且部分模型还可以融合Spark离线建立在历史数据上的预训练模型。