mapreduce流程

为了更好理解,我们从hdfs存储数据开始吧
首先我们将文件存储到hdfs时,文件会分成128m的block,存进各个服务器的datanode中,细节我们就不多说了。
接下来我们要开始对文件mapreduce了,首先我们的客户端向服务器发起job请求,服务器返回jobid和资源提交的路径,客户端向服务器指定位置(tmp)提交配置文件,job的jar包,配置文件,此时yarn创建resourcemanager,rm此时创建appmanager
am向resourcescheduler提交job(注意这里的rs是一个job的队列,一个个job执行)
am选出空闲的nm,nm中开辟出container,该container作为appmaster的容器,appmaster从指定的目录中读取jobid对应的配置,job的jar包,split切片文件,appmaster分析文件后,向resourcemanager申请maptask(我们这里执行mapredurece,所以是maptask)资源,resourcemanager开始将maptask分派给选出的nodemanager,nm会开辟出container给task创造执行环境资源,appmaster得知所有相关的nodemanager准备完毕,便开始向nodemanager下发执行task的命令,此时maptask启动,此时maptask使用recordreader读取hdfs上相应的文件(这里需要说一些细节,我们在读取文件时会split分片,而其实我们存在hdfs上的文件已经物理分块block了,那我们在创建maptask的容器continer时会选择job关联block所在的nodemanager开辟空间,一个block刚好对应一个maptask,也就是逻辑分片和存储分块完美对上了,这里不考虑conbainer的情况)linerecordreader将数据一行一行读取到maptask所在的container中,此时重写的map方法生效,经过map逻辑处理,将数据以key value的形式write出去,进入到下一步的shuffle中,shuffle会先将kv数据分区(这里分区默认是reducetask如果是一个,就-1,所有的数据分区都是0,如果rt大于1就计算key的hash值取模rt的数量,其实就是有多个reducetask就有多少分区号,这里也可以自定义partiton,用自定类重写partition方法)分区完成后,将数据(这里有index和kv数据)写入环形缓冲区,环形缓冲区默认是100m的容量,写入80%容量则开始对数据进行排序,排序规则为字典快排,排序完成将数据溢写磁盘,落盘生成spll.index和spll.out文件,此时环形缓冲区又可循环写入数据,等待再次溢出,生成下一份spll.index和spll.out文件,当文件溢写全部完成,将多份文件进行归并排序(此时多个文件的分区将会归并排序并生成一个文件)合并文件,reducetask将多个map任务生成的合并文件中的相同分区的数据copy到同一个reducetask的container内存中,内存写不下就溢写到磁盘上(此时该reducetask拥有完整的一个分区的数据)对来自不同的合并文件相同分区的数据再次进行归并排序,按照相同的key的数据进行分组,以一组为单位向reduce方法写入,等待reduce处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值