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

27

1
Flink 是一个相对年轻的项目,很难将这个新兴有前途的框架与如此庞大的项目 Spark 进行比较。 - Nikita
我现在不会回答这个问题,因为我们将来会更深入地研究这两个机器学习框架。目前我完全同意@ipoteka的观点。 - Matthias Kricke
2
你应该查看 Flink 最近创建的机器学习库:http://ci.apache.org/projects/flink/flink-docs-master/libs/ml/。正如你在这里所看到的,我们计划做更多:http://goo.gl/h9Qmt3。 - Robert Metzger
2个回答

25
免责声明:我是 Apache Flink 的 PMC 成员。我的回答重点在于比较 Flink 和 Spark 中执行迭代的差异。
Apache Spark 通过展开循环(loop unrolling)来执行迭代。这意味着对于每个迭代,将会安排并执行一组新的任务/操作符。Spark 在此方面非常高效,因为它非常擅长低延迟任务调度(这也适用于 Spark 流处理),并且跨迭代在内存中缓存数据。因此,每个迭代都基于上一个迭代的结果进行操作,而该结果保存在内存中。在 Spark 中,迭代被实现为常规 for 循环(参见逻辑回归示例)。
Flink 以循环数据流的形式执行程序中的迭代。这意味着只需一次安排数据流程序(及其所有操作符),然后从迭代的尾部向迭代的头部反馈数据。基本上,数据在迭代内的操作符之间按循环方式流动。由于操作符只会被安排一次,它们可以在所有迭代中保持状态。Flink 的 API 提供了两个专用迭代操作符来指定迭代:1)批量迭代,它在概念上类似于循环展开;2)增量迭代。增量迭代可以显著加速某些算法,因为随着迭代次数的增加,每个迭代中的工作量都会减少。例如,增量迭代 PageRank 实现的第 10 次迭代完成的速度比第一次迭代快得多。

谢谢你的解释!我理解得对吗,Flink可以在迭代之间保留状态和操作符在工作节点上?这是否意味着与每次新迭代都发送任务的Spark相比,可能会减少开销? - Alexander
4
是的,Flink会让worker上的操作继续运行(这样您就可以在迭代之间轻松保存状态)。通过这种方式,在每次迭代中重新部署任务所需的时间也会得到节省。 特别是使用Fabian提到的增量迭代功能,可以实现仅运行几秒钟的迭代(处理数据的小部分)。 - Robert Metzger
听起来不错!在Flink中,每次迭代的固定开销有多长? 0.1秒的顺序? 更好吗?假设算法什么都不做,只是迭代。 - Alexander
1
好问题。我不知道有没有一个基准测试试图精确地衡量这一点。这应该取决于扩展规模(并行任务数量)和通过迭代运行的数据量。 - Fabian Hueske

0

从我在机器学习和数据流处理方面的经验来看,Flink 和 Spark 在不同领域都表现出色,在机器学习场景中它们可以相互补充。Flink 擅长在线学习任务,通过消费新事件来更新部分模型,并在实时推理中进行。而且,Flink 的部分模型还可以通过 Spark 离线构建的预训练模型进行合并。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接