最码农 最码农
  • 首页
  • 动态广场
  • 精选栏目
  • 闲言碎语
  • 左邻右里
  • 笔记屋
  • 注册
  • 登录
首页 › 大数据 › MapReduce框架原理-MapReduce工作流程

MapReduce框架原理-MapReduce工作流程

Cosy
11月前大数据阅读 392
MapReduce框架原理-MapReduce工作流程-最码农
MapReduce框架原理-MapReduce工作流程-最码农

上面的流程是整个 MapReduce 最全工作流程,但是 Shuffle 过程只是从第 7 步开始到第16 步结束,具体 Shuffle 过程详解,如下:

  • (1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
  • (2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
  • (3)多个溢出文件会被合并成大的溢出文件
  • (4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
  • (5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
  • (6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
  • (7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)

注意:

(1)Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。

(2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb默认100M。

(3)源码解析流程

MapTask


context.write(k, NullWritable.get());   //自定义的map方法的写出,进入
    output.write(key, value);
        //MapTask727行,收集方法,进入两次 
        collector.collect(key, value,partitioner.getPartition(key, value, partitions));
	          HashPartitioner(); //默认分区器
        collect()  //MapTask1082行 map端所有的kv全部写出后会走下面的close方法
	          close() //MapTask732行
	              collector.flush() // 溢出刷写方法,MapTask735行,提前打个断点,进入
                    sortAndSpill() //溢写排序,MapTask1505行,进入
	                      sorter.sort()   QuickSort //溢写排序方法,MapTask1625行,进入
                    mergeParts(); //合并文件,MapTask1527行,进入
MapReduce框架原理-MapReduce工作流程-最码农

collector.close();

ReduceTask


if (isMapOrReduce())  //reduceTask324行,提前打断点
initialize()   // reduceTask333行,进入
init(shuffleContext);  // reduceTask375行,走到这需要先给下面的打断点
    totalMaps = job.getNumMapTasks(); // ShuffleSchedulerImpl第120行,提前打断点
        merger = createMergeManager(context); //合并方法,Shuffle第80行
			      // MergeManagerImpl第232 235行,提前打断点
			      this.inMemoryMerger = createInMemoryMerger(); //内存合并
			      this.onDiskMerger = new OnDiskMerger(this); //磁盘合并
		    eventFetcher.start();  //开始抓取数据,Shuffle第107行,提前打断点
		    eventFetcher.shutDown();  //抓取结束,Shuffle第141行,提前打断点
		    copyPhase.complete();   //copy阶段完成,Shuffle第151行
		    taskStatus.setPhase(TaskStatus.Phase.SORT);  //开始排序阶段,Shuffle第152行
	  sortPhase.complete();   //排序阶段完成,即将进入reduce阶段 reduceTask382行
reduce();  //reduce阶段调用的就是我们自定义的reduce方法,会被调用多次
	  cleanup(context); //reduce完成之前,会最后调用一次Reducer里面的cleanup方法

MapReduce 教程
赞赏 赞(0) 收藏(0)
MapReduce框架原理-InputFormat数据输入
上一篇
MapReduce框架原理-Shuffle 机制
下一篇
再想想
暂无评论
随 机 推 荐
基于Layui的兽音译者加密页面
Hadoop 小文件优化方法
Hadoop2.x 和 Hadoop3.x 的新特性
MapReduce框架原理-InputFormat数据输入
Hadoop概论(一)—— 开篇词
Hadoop HDFS(二)
Hadoop HA 高可用
Hadoop 数据压缩
  • 0
  • 0
介绍

我们致力于打造一个原创的计算机相关技术的博客网站,旨在为访客提供一个优质的计算机技术教程交流平台。网站开辟了很多于计算机相关的栏目,并且收集了不少实用资源,同时也鼓励欢迎访客一起分享、交流、学习。

灵魂推荐
Veer图库 数码荔枝
栏目标题
首页 动态广场 精选栏目 闲言碎语 左邻右里 笔记屋
Copyright © 2021-2023 最码农. 苏ICP备20033168号
  • 首页
  • 动态广场
  • 精选栏目
  • 闲言碎语
  • 左邻右里
  • 笔记屋
# 教程 # # Hadoop # # HDFS # # 人工智能 # # 算法 #
Cosy
即使世界毁灭,也总有回光返照的那一刻
90
文章
3
评论
425
喜欢