一、MR执行流程和原理图
1.1、执行流程和原理图
mapTask的并行机制
-
mapTask在运行的时候,开启多个map由谁来决定?
默认情况:mapTask 的数量和读取 HDFS 中的数据块 block 的数量相等
-
block块:HDFS 中文件各个小数据块(默认 128m )(物理划分)
-
FileSplit: 在MapReduce 读取每一个块称为 fileSplit(文件切片)(逻辑划分)
block 的数量 和 文件分片的数量一样,大小也是一样。
Mapreduce 中 map 阶段的运行机制
-
读取HDFS中数据, 启动mapTask数量与 读取文件的block块(fileSplit)数量是相等的
-
在读取数据过程中 , 读取一行就会调用一次 MapTask中map方法, 在map方法中, 将接收到k1 和 v1 转换为 k2 和 v2 过程
-
当map处理一条数据后, 往出写, 只要一写出去, 就会执行分区(partition)操作,分区操作的核心, 对这条数据进行打分区标记的过程:
默认分区方案: hash 取模计算法 % numReduceTask,分区可以保证: 相同key , 打上分区的编号必然是一样的
-
当分好区以后, 数据就会被写入到 环形缓冲区中, 环形缓冲区本质上就是一个内存空间(数组), 大小为100M
mapTask一条一条的输出, 分区一条一条处理, 一条条的数据写入到环形缓冲区, 当这个环形缓冲区容量达到0.8系数就会启动一个溢写的线程, 将80%的数据进行溢写到磁盘上, 在溢写过程中就会执行排序的工作, 如果此时有规约, 此时就是执行规约的时候了。
-
当mapTask执行完成后, 如果环形缓冲区依然还有一些剩余数据, 一次性全部溢写到磁盘上, 此时在磁盘上就会有多个溢写出来的临时文件, 然后对这些临时文件进行merge合并操作, 形成一个最终的排好序,分好区 规约好的大文件。
Mapreduce 中 reduce 阶段的运行机制
-
当reduceTask检测到mapTask全部都执行完成了, 开启copy的机制, 从多个mapTask中拷贝属于自己的分区的数据
-
在copy过程中, 会先将数据写入到内存中, 当内存存储不下的时候, 在溢写到磁盘上, 形成临时文件
-
当copy结束后, 会将所有溢写出来的临时文件全部合并为一个大文件, 此时在合并的过程中, 会对数据进行重新的排序工作, 如果reduce只有一个, 此时排序就是全局排序, 如果是多个, 依然是局部排序操作
-
对排序好数据, 执行分组操作, 将相同key的value数据合并为一个集合, 然后分好一组, 调用一次reduceTask中
reduce方法
-
reduce方法执行完成后, 将结果数据直接输出到即可
-
输出组件就会将reduce的输出内容, 输出到目的地址上...
环形缓冲区等配置
配置 默认值 解释
mapreduce.task.io.sort.mb 100 设置环型缓冲区的内存值大小
mapreduce.map.sort.spill.percent 0.8 设置溢写的比例
mapreduce.cluster.local.dir ${hadoop.tmp.dir}/mapred/local 溢写数据目录
mapreduce.task.io.sort.factor 10 设置一次合并多少个溢写文件