Apache Flink与Hadoop上的Mapreduce相比如何?在哪些方面更好,为什么?
免责声明:我是Apache Flink的提交者和PMC成员。
与HadoopMapReduce类似,ApacheFlink是一个具有自己的API和执行引擎的并行数据处理器。Flink旨在支持Hadoop正在使用的许多用例,并与Hadoop生态系统中的许多系统(包括HDFS和YARN)配合良好。
我将通过区分MapReduce编程模型和MapReduce执行模型来回答您的问题。
编程模型
ApacheFlink的编程模型基于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中(正如ApacheHadoop所做的那样),每个MapReduce程序的执行都遵循完全相同的模式。Flink程序被提供给优化器,优化器可以计算出有效的执行计划。与关系型DBMS类似,优化器选择数据传输和连接策略的方式可以避免诸如数据搅乱和排序之类的昂贵操作。我应该指出的是,Flink还没有在Hadoop运行的大规模扩展上进行测试。我知道Flink设置可以在多达200个节点上运行。
添加到Fabian的答案:
另一个不同之处在于,Flink不是一个纯粹的批量处理系统,但可以同时进行低延迟流分析,并提供一个很好的API来定义流分析程序。
在内部,Flink实际上是一个流媒体系统。对于Flink来说,批处理程序是流媒体程序的一种特殊情况。