Hadoop小集群上减少MR任务调度延迟

时间:2022-01-14 20:07:01

作者:刘旭晖 Raymond转载请注明出处

Emailcolorant at163.com

BLOGhttp://blog.csdn.net/colorant/

 

最近在Hadoop1.0.4稳定版上搭的1+4节点上运行MR Job,遇到一些Latency的问题,记录Share一下


hadoop 1.0.4的版本中,Jjobtracker默认的最小Heartbeat间隔是3,并且 Tasktracker默认只在HeartBeat包中报告任务完成状态和请求新的Task.这样的设定是防止大集群中Jobtracker来不及处理任务调度.但是在小集群中,这就导致了Task调度的Latency比较高,因此对于数据量小,Maptask多的Job,总体的Overhead就很大

 

在我的1+4 node的试验集群中,对一个480regionHBase表进行扫描,每台机器24Map Task.总共需要运行5个批次.在每个Maptask不做任何事情立刻返回的空操作下,完成这样一个MR Job需要64秒左右。可以认为基本就是MR框架的开销。

 

为了加快调度,可以在mapred-site.xml中设置如下参数

 

<property>

   <name>mapreduce.tasktracker.outofband.heartbeat</name>

   <value>true</value>

</property>

 

<property>

   <name>mapreduce.tasktracker.outofband.heartbeat.damper</name>

   <value>5</value>

</property>

 

基本上就是允许任务完成时,更快的向JobTracker汇报,dampper值越大,加快的系数越大,但是这里似乎有一个Bug,默认不设的话是100000,即使空闲时,Tasktracker的CPU占用率也高达80%以上。

 

在前述480 regions的例子中,整个Job完成的时间缩短到约48秒。

 

但是,由于JobTracker的最小Heartbeat3s,所以最快一个Task还是需要3s完成

 

hadoop 1.1.1附近的版本,将Jobtracker最小的Heartbeat改为了300毫秒,这样也就改进了小Task的调度延迟。

 

同样上述 480 regions的例子,使用hadoop 1.1.1, Job完成的时间缩短到了大概30秒,现在最小任务可以在0.3内秒完成了。