ChainMapper, ChainReducer和Map-Reduce-Reduce

我会写一系列短文,分析Hadoop和我们的ODPS产品的一些特性对比,希望从中可以简单理一下Hadoop和ODPS设计上的一些思路异同。

水平有限,疏漏处请见谅。

本篇讲Hadoop的链式任务模型和ODPS的M-R-R任务模型。需要先声明的是,这两个东西看起来类似,但是试图解决的完全是不同的问题。

Hadoop

Hadoop有所谓ChainMapper和ChainReducer的编程模型,即Map后接Map,或者Reduce后接Map。

很显然这样的好处是便于复用已经实现的Mapper逻辑。

ChainMapper

ChainMapper是在Mapper后面接Mapper。如图,M1任务中直接增加两个Mapper,连续执行。

ChainReducer

ChainReducer是在Reducer后面接Reducer。如图,R1任务中直接增加两个Mapper,连续执行。

两点简单的事实

  • Hadoop 的Chain的好处是复用Map逻辑,理论上不需要额外的IO,但是也仅止于代码级别的复用。无论”Chain”了 多少个Mapper,还是一个Task;
  • Reducer只能有一个。一旦多个Reducer就意味着多个作业。

ODPS

ODPS在设计时,分析是没有Chain的实际需求。

在基础M-R模型之外,ODPS 提供的是Map-Reduce-Reduce的编程模型。但是不仅仅是编程模型,而是在调度和IO上都有优化。

传统多作业模型

如果没有M-R-R,有多少个Reduce过程,就有多少个作业。

M-R-R模型

有多少个Reduce过程,就有多少个Shuffle,这一点永远不会改变。但是M-R-R模型减少了一次Mapper的读写磁盘过程,对比前面那张图,我们看少了一个M2,也就意味着少了一组磁盘IO。

M-R-R的意义是: 原来需要割裂为多个计算任务的作业现在是作为一个任务提交,而且不仅仅是作业逻辑上的简化,由于不需要硬在Shuffle之间(即Reducer之间)接Mapper,减少了一次磁盘的读写,真正达到了性能的极大优化。

对比

Hadoop 的两种Chain其实都只是编程逻辑上的复用,Chain Mapper相当于构造多个Mapper共同完成一个Map Task, Chain Reducer相当于Reducer之后不立刻输出文件,而是还要经过一系列Mapper的加工。Mapper或Reducer之后连接的Mapper不需要多余的IO,但是这个事情本身还是一个Task中完成。如果程序员并不采用Chain,而是在编码中进行map方法的重构和复用也能达到目的。

两者最直观的区别,是Chain里最多只有一个Reducer,只有一次Shuffle过程,而ODPS的MRR中理论上可以有多个 Reducer,每个Reducer都对应一次Shuffle。

Footnotes:

1 ODPS的MR在输入输出接口上和Hadoop有一些差异,屏蔽了很多底层细节。我想如果要做Chain这种本质是数据格式转来转去的事情会是有点"脏"的。
2 现在Tez也能做到Map-Reduce-Reduce模型。可是Tez另有一套API接口,相比ODPS还是有一点复杂。


最后更新: 2015-12-02 08:41