Apache Flink 与 Hadoop 上的 Mapreduce 相比如何?

How does Apache Flink compare to Mapreduce on Hadoop?

Apache Flink 与 Hadoop 上的 Mapreduce 相比如何? 它在哪些方面更好,为什么?

免责声明:我是 Apache Flink 的提交者和 PMC 成员。

与 Hadoop MapReduce 类似,Apache Flink 是一个并行数据处理器,具有自己的 API 和执行引擎。 Flink 旨在支持 Hadoop 正在使用的许多用例,并与 Hadoop 生态系统中的许多系统(包括 HDFS 和 YARN)很好地协同工作。

我将通过区分 MapReduce 编程模型和 MapReduce 执行模型来回答您的问题。

编程模型

Apache Flink 的编程模型基于 MapReduce 编程模型的概念,但以多种方式对其进行了概括。 Flink 提供 Map 和 Reduce 功能,但也提供其他转换,如 Join、CoGroup、Filter 和 Iterations。这些转换可以组合在任意数据流中,包括多个源、接收器以及分支和合并流。 Flink 的数据模型比 MapReduce 的键值对模型更通用,允许使用任何 Java(或 Scala)数据类型。可以灵活地在这些数据类型上定义键。

因此,Flink的编程模型是MapReduce编程模型的超集。它允许以更方便和简洁的方式定义许多程序。我还想指出的是,可以在 Flink 程序中嵌入未修改的 Hadoop 函数(Input/OutputFormats、Mapper、Reducers)并与原生 Flink 函数联合执行。

执行模型

从执行模型来看,Flink借鉴了并行关系型数据库系统的很多概念。 Flink 具有流水线处理模型,减少了在本地或分布式文件系统上实现中间结果的需要(此外,这还允许 Flink 进行实时流处理)。此外,Flink 程序的执行与程序规范并不紧密耦合。在 MapReduce 中(由 Apache Hadoop 完成),每个 MapReduce 程序的执行都遵循完全相同的模式。 Flink 程序被提供给优化器,优化器计算出有效的执行计划。与关系 DBMS 类似,优化器选择数据传输和连接策略,以避免数据混洗和排序等昂贵的操作。我应该指出,Flink 尚未在 Hadoop 正在 运行 进行的大规模横向扩展中进行测试。我知道 运行 在多达 200 个节点上的 Flink 设置。

添加到 Fabian 的回答:

还有一点不同的是,Flink不是一个纯批处理系统,而是可以同时进行低延迟的流式分析,并且提供了一个很好的API定义流式分析程序。

在内部,Flink其实是一个流式系统。对于 Flink 来说,Batch 程序是流式程序的特例。