最近在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内秒完成了。