MapReduce是一种分布式编程模型,采用‘分而治之’的思想,将一个大规模数据集分解成多个小规模数据,然后分发给集群中多个节点共同计算。这样可以有效的降低每一部分的运算复杂度,达到提高运算效率的目的。
MapReduce模型将计算分为两个阶段:Map阶段和Reduce阶段。Hadoop将MapReduce的输入数据划分为等长的数据块,称为输入分片(split),为每一个分片构建一个Map任务,并且由该任务来运行用户自定义的Map函数,以处理分片的每条记录。Map任务输出时要按照Reduce任务的数量进行分区,即为每一个Reduce任务新建一个分区,同时对每个分区进行排序。Reduce任务启动后,会向所有Map任务拉取数据并在Reduce端合并,Map任务和Reduce任务之间的数据流称为混洗(shuffle)。最后由用户自定义的Reduce函数处理,其输入通常存储在HDFS上,以实现可靠存储。
MapReduce由于设计上的一些限制,导致处理性能较慢,针对这个问题,业界也有很多优化方案及替代产品,但真正发展起来的,目前主要由Spark。Spark也是一个批量计算框架,它将数据抽象成RDD、DataFrame,这是一种分布式的内存抽象,允许在大型集群上执行基于内存的计算,大大减少了迭代计算所需要的开销。

Spark较MapReduce的优势:
数据处理技术:Spark将执行模型抽象为通用的有向无环图(DAG)执行计划,这可以将多个Stage串联或者并行执行,而无须将Stage的中间结果输出到HDFS中。
数据格式和内存布局:Spark RDD能支持粗粒度写操作,而对于读操作,RDD可以精确到每条记录,这使得RDD可以用来作为分布式索引。
执行策略:MapReduce在数据Shuffle之前话费了大量的时间来排序,Spark支持基于Hash的分布式聚合,调度中采用更为通用的任务执行DAG,每一轮的输出结果都可以缓存在内存中。