赞
踩
1)AppMaster:用于阶段调度,它负责程序中各个阶段的调度,一个jar包一个AppMaster。
阶段一:MapTask
阶段二:ReduceTask
用户的每一个计算请求称为一个作业.
每个作业包括:
1)文件的大小
2)一个片的大小
3)任务的数量
4)Job的名字“wordcount”
5)AppMaster分配的资源等
每一个作业都需要被拆分开来,交由多个主机来完成,拆分出来的执行单位就是任务.
Task又分为如下三种类型的任务:
负责Map阶段数据的处理
MapTask调用map()方法,结果返回给MapTask
MapTask的并行度:开启多少个MapTask
MapTask个数的决定因素:
1)数据量
2)一个片的大小
3)文件的个数
负责整个Reduce阶段数据的处理
负责整个程序的过程调度及状态调优
提交Job进程.
ResourceManager只是负责分配资源.AppMaster申请多少资源,ResourceManager就分配多少资源,不管分配的资源是否被利用,ResourceManger不做任何交验。
在NodeManager在Container上运行程序,Container是一块资源的容器。
Container是Yarn中的一个动态资源分配的概念。由ResouceManger分配给AppMaster或者MapTask或者ReduceTask。
由客户端决定。申请多少资源就是申请Container,Container是分配给
1)AppMaster(只要有MapReduce程序就有一个)
2)MapTask(客户端提交job信息中有文件的大小,一个片多大,文件的个数,就可以算出有多少片,就有多少个MapTask)
3)ReduceTask(由配置文件决定,写到job里)
job.setNumReduceTasks(3); //设置reducetask的个数,默认是1
数据存储在HDFS上,计算在NodeManger的Continer上,所以NodeManger和DataNode是不分离的。
Yarn集群负责公司所有job的运行,所以有可能提交job的时候,没有运行资源可以使用(全部占满),其实yarn有一个等待队列,把job放在里面。
1客户端向ResorceManager提交job
2ResorceManager响应,返回jobId,返回jar包在HDFS上的路径
3.客户端把wc.jar放到HDFS上
4.ResourceManager分配一个Container资源给AppMaster
5.客户端给Container发启动AppMaster的命令
6.AppMaster向ResourceManager申请MapTask的资源,AppMaster申请多少资源,ResourceManager就分配多少资源,不管分配的资源是否被利用,ResourceManager不做任何校验.
7.ResourceManager为MapTask分配资源后,把任务的信息(jar的存放路径,有哪些机器运行,每台机器上运行的数据是什么)放到队列里.
8.NodeManager每隔1秒向ResourceManager发送一次心跳,ResourceManger把任务的信息返回给它,当任务的信息中指定的机器有它的话,当它空闲的时候就会到HDFS上把jar包拉取下来,并给AppMaster一个响应,告知已经拿到jar包,询问AppMaster怎么启动任务.拿到AppMaster的响应后,启动MapTask.
9.AppMaster监控MapTask的状态,当MapTask运行结束的时候,AppMaster会接到它的反馈,会继续申请资源运行ReduceTask.只要有一个MapTask结束,就可以启动ReduceTask,ReduceTask收集MapTask运行完的数据,当所有MapTask运行完了,数据也就收集完了,就可以运行汇总程序.
nextKeyValue()返回值为boolean类型
getCurrentKey()返回k(偏移量)
getCurrentValue()返回v(该行的内容)
MapTask新开一个线程:OutputCollection(收集数据,将数据放进环形缓冲器).这个环形缓冲器默认大小为100M,环形缓冲器的数据按照发出顺序接收.当80M满了.MapTask会新开一个线程:Spiller溢出器,它负责环形缓冲器的溢出.要求这个溢出的过程能快速进行(所以用内存),溢出做了三件事:
1)分区:hashPartitioner
2)排序:用快速排序
3)溢出:将数据写往磁盘
数据一直写,当完成80%,在溢出的同时,把指针指到保留区开始写,溢出完,将环上空白区域设成新的保留区,原来的保留区因为有了数据,直接变成80%的一部分.
问题:
1)万一20M不够怎么办?
20M是默认值,是通过大量测试得到的一个通用值,这个值可以通过配置文件修改.
2)最后一次环形缓冲器没有写满没办法溢出怎么办?
MapTask读完数据后,环形缓冲区是它的一个进程,MapTask会检查环形缓冲器中是否还有内容,如果有则溢出,然后才结束.
3)怎么知道结果的数据属于哪个区?
有一个维护分区的东西:index
0号分区发往0号ReduceTask
1号分区发往1号ReduceTask
2号分区发往2号ReduceTask
有一个MapTask端结束,就可以开始ReduceTask,ReduceTask是AppMaster启动的.ReduceTask启动之后先拉取相应分区的数据.
等所有MapTask端输出的文件都在ReduceTask合并完,ReduceTask调用MyReducer的reduce(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。