MapReduce 分布式计算入门
在学 hadoop 的我们最先接触的分布式框架就是MapReduce框架,本意就是通过使用MapReduce 框架进行实现圆周率 π 的分布式计算的小demo;
MapReduce 的处理流程
Mapper 阶段执行流程
第一阶段 将输入目录下的文件按照一定的标准进行逻辑切片,形成片规划.默认的切片规则是按照 文件块 切片.每片都有一个 MapTask 进行处理.(getSplits)
第二阶段 是对切片中的数据按照一定的规则解析成 key,value 元组.默认规则是把每一行文本内容解析成键值对. key 是每一行的起始位置,value 是本行的文本内容.(TextInputFormat)
第三阶段 是调用Mapper 类中的Map 方法. 上阶段每解析出来一个 k,v 调用一次 map 方法.输出同样是键值对,但是可以有多个输出.
第四阶段 是按照一定的规则对第三阶段输出的键值对进行分区。 默认是只有一个区。 分区的数量就是 Reducer 任务运行的数量。默认只有一个Reducer 任务。
第五阶段是对每个分区中的键值对进行排序。如果有第六阶段,那么进入第六阶段;如果没有,直接输出到文件中。
第六阶段是对数据进行局部聚合处理,也就是 combiner 处理。 键相等的键值对会调用一次 reduce 方法。经过这一阶段,数据量会减少。 本阶段默认是没有的。
Reduce 阶段执行流程
第一阶段是 Reducer 任务会主动从 Mapper 任务复制其输出的键值对。Mapper 任务可能会有很多,因此 Reducer 会复制多个 Mapper 的输出。
第二阶段是把复制到 Reducer 本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段是对排序后的键值对调用 reduce 方法。 键相等的键值对调用一次reduce 方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到 HDFS 文件中。
进行圆周率 π 的分布式计算
从分 MapReduce 的执行流程看出,分布式框架已经帮我们实现了任务的分发,因此我们的关注点就基本可以不用考虑关于分布式方面的任务,我们主要需要关注的就是 map 方法的构建
,和 reduce 方法的构建.
数学模型
进行分布式计算的任务有个先决条件,那就是可以进行并行计算,就是各 map 之间相互独立,无依赖关系.
因此,我们在建立数学模型时最好是一个重复计算无相互关联的模型,而 蒙特卡洛 的模型恰好符合这种特点,因此我们依次构建模型.
在上篇文章中,我们采用的通过面积比的方式来近似求解 圆周率 π ,即正方形面积为 1 ,扇形面积为 π/4,则正方形和扇形的面积比为 π/4,求得这个面积比,我们就能得到最后的 π;
蒙特卡罗方法,就是将面积比转化为概率问题求解,就是在正方形中取一随机点进行重复试验,统计出这个点落在扇形中的概率.用这个概率去描述扇形和正方形的面积比,求得概率即可近似求出圆周率 π 的大小;
随机试验的优点是,每次试验相互独立互不影响,缺点随机性大,数据不稳定,一般只用做近似求解.
综上,我们可以将 求解圆周率的任务 转化为随机试验的统计工作.