MapReduce的执行流程

在这里插入图片描述

(1) 执行Driver的main方法,里面有个job.waitForCompletion(),在该方法里面完成任务的准备,主要包括将输入数据切片并将切片规划写到job.split文件里面,生成运行任务时的配置文件job.xml,将我们写的mapreduce程序打成jar包。准备好了之后,将任务提交给yarn的resourcemanager。
(2) Resourcemanager收到客户端提交的任务后,会选一个nodemanager,在其上边生成一个mapreduce application master进程,由该进程负责指挥调度刚刚提交的任务。
(3) Master会分析我们的任务,查看任务的切片数量,然后启动相应的map task的数量,假定有两个切片,那么就会生成2个map task。
(4) 开始执行所有的map task,这些map task 并行运行,互相独立,会执行我们在重写的Mapper类的map方法,我们在map方法中写入自己的业务逻辑。Map方法有两个变量即key和value,这两个变量由框架(也就是LineRecordReader类)帮我们从输入数据读取进来封装到这两个变量中,我们只需要拿过来即可。
(5) 在map方法里面对输入数据key和value进行自己的业务逻辑处理后,要把我们的结果也要封装好key value的形式写出去写出到outputCollector即环形缓冲区。
(6) key-value键值对从map中写出后,在进入到环形缓冲区之前,会经过分区器,得到一个所属分区的区号标记,意味着该key-value以后将被溢写到哪个分区。
(7) 环形缓冲区是个位于内存的数据结构,默认大小是100M,可以在hadoop的配置文件中通过io.sort.mb参数修改,当来到环形缓冲区的数据越来越多,达到容量80%的时候,这些环形缓冲区的kv对会被溢写到磁盘上,但是并不是把所有的kv溢写到一个文件,而是根据每个kv的所属分区,溢写到多个分区文件。如果在溢写后,环形缓冲区的数据又要满了,还会溢写多次。另外每一次溢写的时候,会读所有的kv根据mapper的keyout排序后溢出。这种溢写我们称之为区内有序,也就是溢写后的kv数据既要分区也要排序。
(8) 等所有的kv都溢写完毕后,会形成多个分区小文件,还要对这些分区小文件进行归并排序,所谓归并排序就是把多个有序的小文件变为一个有序的大文件。这个map task执行完成后,会形成多个分区文件,每个文件都是排好续的。
(9) Map task执行完毕后,接下来开始执行reduce task。因为map task形成了两个分区文件,所有需要两个reduce task,我们先说第一个reduce task,第二个流程跟第一个类似。Reduce task 1先把两个map task机器上的分区1数据下载下来,如果内存放不下的话,把数据放到磁盘上。
(10) 然后对下载下来的多个分区1的数据进行归并排序,排好序之后,调用分组比较器将所有kv按照k进行分组,然后将每组kv准备好去调用一次reduce方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值