梳理一下MapReduce 1 的基本概念,仅供参考。
上面这个图,基本上可以说明MapReduce的工作流程。下面细说,并举了一个实例。
MapReduce工作就是将处理过程划分为两个阶段:map阶段和reduce阶段。每个有key-value对作为输入和输出,其类型是由程序员选择的。程序员能够指定有个函数:map函数和reduce函数。
举一个简单的例子,具体说明MapReduce的工作细节。假设有一堆天气数据需要处理,而我们仅对天气数据中的年份和气温字段信息感兴趣。一个map函数的功能就是一个数据准备阶段,准备好Reduce阶段能够处理的数据,而reduce函数将一年中的多个气温(temperature)数据中取最大的值。map函数需要将错误数据以及一些不符合规则的数据给过滤掉,筛选出有效数据,传送给reduce阶段进行处理。
为了可视化map的工作,假设有下列输入文件中的多行记录数据
0067011990999991950051507004...9999999N9 00001 99999999999... 0043011990999991950051512004...9999999N9 00221 99999999999... 0043011990999991950051518004...9999999N9-00111 99999999999... 0043012650999991949032412004...0500001N9 01111 99999999999... 0043012650999991949032418004...0500001N9 00781 99999999999...
到了map函数处理阶段,数据就变成key-value对。
(0, 0067011990999991950051507004...9999999N9 00001 99999999999...) (106, 0043011990999991950051512004...9999999N9 00221 99999999999...) (212, 0043011990999991950051518004...9999999N9-00111 99999999999...) (318, 0043012650999991949032412004...0500001N9 01111 99999999999...) (424, 0043012650999991949032418004...0500001N9 00781 99999999999...)
关键字是线性偏离,我们在map函数中可以忽略。map 复制抓取到对应year和temperature字段,最后发布给对应的reduce函数作进一步处理。提交的数据如下:
(1950, 0) (1950, 22) (1950, −11) (1949, 111) (1949, 78)
在发送到reduce函数处理前,这个输出会被MapReduce框架处理。MapReduce框架的处理包括以关键字进行排序和分组等。在reduce处理前,看到的数据就是这样:
(1949, [111, 78]) (1950, [0, 22, −11])
reduce函数将根据关键字来迭代value,选出最大的值作为key的value,并将这对值输出。
(1949, 111) (1950, 22)
上面便是最终的输出结果序列。整个处理过程可以用下列这个流程图来说明。
后续将介绍MapReduce 2,即YARN(Hadoop 2新推出的架构)。待续!