一个Mapreduce做业是经过JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient经过RPC协议提交做业),JobTasker接到JobClient的请求后把其加入做业队列中。
DataNode节点的TaskTracker一直经过RPC(RPC--远程过程调用协议它是一种经过网络从远程计算机上请求服务,而不须要了解底层网络技术的协议)向JobTasker发送heartbeat询问有没有任务作,若是有则让其派发任务过来,TaskTracker在其本地发起Task,执行任务。算法
做业调度策略有三种:apache
一、默认调度算法--FIFO队列策略:网络
hadoop默认调度器,它先按照做业优先级的高低,再按照到达时间的前后来选择被执行的做业。框架
优势:调度算法简单,JobTracker工做负担轻。机器学习
缺点:忽略了不一样做业的需求差别。例如若是相似于对海量数据进行统计分析的做业长期占据计算资源,那么在其后提交的交互型做业有可能迟迟得不处处理,从而影响用户体验。oop
二、计算能力调度算法Capacity Scheduler(Yahoo 开发)学习
(1)Capacity Scheduler 中能够定义多个做业队列,做业提交时将直接放入到一个队列中,每一个队列中采用的调度策略是FIFO算法。spa
(2)每一个队列均可以经过配置得到必定数量的task tracker资源用于处理map/reduce操做,调度算法将按照配置文件为队列分配相应的计算资源量。code
(3)该调度默认状况下不支持优先级,可是能够在配置文件中开启此选项,若是支持优先级,调度算法就是带有优先级的FIFO。xml
(4)不支持优先级抢占,一旦一个工做开始执行,在执行完以前它的资源不会被高优先级做业所抢占。
(5)对队列中同一用户提交的做业可以得到的资源百分比进行了限制以使同属于一用户的做业不能出现独占资源的状况.
Capacity Scheduler内存管理
Capacity Scheduler能有效地对hadoop集群的内存资源进行管理,以支持内存密集型应用。做业对内存资源需求高时,调度算法将把该做业的相关任务分配到内存资源充足的task tracker上。在做业选择过程当中,Capacity Scheduler会检查空闲的tasktracker上的内存资源是否知足做业要求。Tasktracker上的空闲资源(内存)数量值能够经过tasktracker的内存资源总量减去当前已经使用的内存数量获得,然后者包含在tasktracker向jobtracker发送的周期性心跳信息中。
配置Capacity Scheduler
步骤:
一、cd $HADOOP_HOME/contrib/capacity-scheduler
二、cp hadoop-capacity-scheduler-0.20.2-cdh3u2.jar $HADOOP_HOME/lib
配置$HADOOP_HOME/conf下的map-site.xml,增长
1 <property> 2 <name>map.jobtracker.taskScheduler</name> 3 <value>org.apache.hadoop.mapred.CapacityTaskScheduler</value> <!--这个就是刚才拷过去的jar里面的类--> 4 </property> 5 <property> 6 <name>mapred.queue.names</name> <!--定义队列--> 7 <value>default,bean</value><!--两个队列一个default(默认)bean队列--> 8 </property> 9 10 <!--修改$HADOOP_HOME/conf下cpacity-scheduler.xml增长属性以下--> 11 <property> 12 <name>mapred.capacity-scheduler.queue.default.capacity</name> 13 <vaule>100</value> 14 </property> 15 <property> 16 <name>mapred.capacity-schelduler.queue.bean.capacity</name> 17 <value>100</value> 18 </property>
选择队列(执行前须要作):
set mapred.job.queue.name = bean(对列的名字)
三、公平份额调度算法Fair Scheduler(Facebook开发)
Facebook要处理生产型做业(数据统计分析,hive)、大批处理做业(数据挖掘、机器学习)、小型交互型做业(hive查询),不一样用户提交的做业型在计算时间、存储空间、数据流量和相应时间上都有不一样需求。为使hadoop mapreduce框架可以应对多种类型做业并行执行,使得用户具备良好的体验,Facebook公司提出该算法。
Fair Scheduler调度中,只有一个做业执行时,它将独占集群全部资源。有其余做业被提交时会有TaskTracker被释放并分配给新提交的做业,以保证全部的做业都可以得到大致相同的计算资源。
做业池:
为每个用户创建一个做业池,用户提交的做业将会放进一个可以公平共享资源的pool(池)中,每一个做业池设定了一个最低资源保障,当一个池中包含job时,它至少能够得到minmum share的资源(最低保障资源份额机制)。
池中的做业得到必定份额的资源,能够经过配置文件限制每一个池中做业数量,缺省状况下,每一个做业池中选择将要执行的做业的策略是FIFO策略,先按照优先级高低排序,而后再按照提交时间排序。
Deficit(赤字,不足):
Fair Scheldure为每一个做业定义了一个deficit指标,Deficit是一个做业在理想状况下的得到的计算资源和实际中得到的计算资源之间的差距。Fair Scheduler会每隔几百毫秒观察每一个做业有多少任务已经在这个时间间隔内执行,并将结果与它的资源份额比较,一更新该做业的deficit值。一旦有空闲的task tracker出现,首先分配给当前具备最高deficit值得做业。
例如:若是系统中存在着还没有得到最低资源保障的做业池,那么该池中的做业将会优先调度,而选择池中的做业须要根据他们的deficit来决定。这样作是为了尽量知足做业池最低保障资源份额的限制。
配置:
cd $HADOOP_HOME/contrib/fairscheduler
cp *.jar $HADOOP_HOME/lib
注:通常版本里,lib下包含这个包
配置$HADOOP_HOME/conf下的map-site.xml,增长
1 <property> 2 <name>mapred.jobtracker.taskScheduler</name> <!--加载jar包中的类--> 3 <value>org.apache.hadoop.mapred.FairScheduler</value> 4 </property> 5 <property> 6 <name>mapred.fairscheduler.allocation.file</name> 7 <value>$HADOOP_HOME/conf/fair-scheduler.xml</value> 8 </property> 9 <property> 10 <name>mapred.queue.names</name><!--定义队列--> 11 <value>default,bean</value><!--两个池一个default(默认)bean池--> 12 </property> 13 <!--加上这么一个--> 14 <property> 15 <name>mapred.fairscheduler.preemption</name> 16 <value>true</value> 17 </property>
fair-schelduler.xml根据文件里面给的例子配置就能够了。
选择队列(执行前须要作):set mapred.job.queue.name = bean(池的名字)
注:配置可能会出错,多是不能用$HADOOP_HOME把它改问绝对路径。