分布式并行编程模型MapReduce
MapReduce模型简介
设计理念:计算向数据靠拢–一个集群中mapreduce框架会将map程序就近的在HDFS数据所在节点运行,讲计算节点、存储节点放在一起运行,减少节点间数据移动开销。
Master/slave架构:
-
master:jobtracker;负责作业和任务调度,监控执行,重新调度已失败的任务
-
slave:tasktracker;负责执行由jobtracker指派的任务
在mapreduce的整个执行过程中,map任务的输入文件、reduce任务的处理结果都保存在分布式文件系统,而map任务处理得到的中间结果则保存在本地磁盘中。
MapReduce各个执行阶段
- 用inputformat做map前的预处理,inputsplit对文件进行处理和运算的输入单位,记录要处理的数据位置和长度
- recordreader(RR)根据inputsplit信息来处理,转换成适合map任务读取的键值对,输入至map
- map根据用户自定义的映射规则,输出<key,value>作为中间结果
- shuffle:对map输出进行分区、排序、合并、归并等操作,得到<key,value-list>中间结果,交给对应reduce程序处理。
- reduce以<key,value-list>作为输入,输出给outp,utformat模块
- outputformat验证输出目录是否存在,及结果类型是否符合配置文件配置类型,都满足则输出reduce结果到分布式文件系统
shuffle过程
-
Map端操作
map输出结果首先被写入缓存,缓存满时启动溢写操作,将缓存数据写入磁盘文件并清空缓存。随map任务进行磁盘会生成多个溢写文件,在map任务全部结束前溢写文件会被归并成一个大磁盘文件,通知相应reduce任务来领取自己所需处理的数据。
步骤:
- 输入数据和执行map任务
- 写入缓存
- 溢写(分区、排序、合并)(写入溢写文件所有键值对,都是经过分区和排序的)
- 文件归并:对于具有相同key的键值对会被归并成一个新的键值对。若磁盘中已经生成的溢写文件超过min.num.spills.for.combine(用户可修改),则运行combine
-
reduce端操作
reduce从map端不同map机器领回自己所需处理的数据,对数据进行归并(merge)后交给reduce处理