为了更好理解,我们从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处理。
mapreduce流程
于 2023-03-24 22:22:07 首次发布