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

最近在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的试验集群中,对一个480region的HBase表进行扫描,每台机器24个Map 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的最小Heartbeat是3s,所以最快一个Task还是需要3s完成

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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5165804ccc572ff4586d19f116004df5.html