Apache Flink相对于Hadoop上的Mapreduce有何不同?它的优势在哪里以及为什么?
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所运行的大规模扩展方面进行过测试。我知道有Flink设置可以运行200个节点。
补充Fabian的回答:
另一个区别是,Flink不仅是纯批处理系统,同时可以进行低延迟流分析,并提供了一个很好的API来定义流分析程序。
内部而言,Flink实际上是一个流处理系统。对于Flink来说,批处理程序是流处理程序的一种特殊情况。