这几天一直在优化job,下面是我认为有用的一些tips。
- 推测执行在整个集群上关闭,特定需要的作业单独开启,一般可以省下约5%~10%的集群资源。由mapred.map.task.speculative.execution[default true]和mapred.reduce.task.speculative.execution[default true]分别控制map和reduce的推测执行开关。
mapred.map.task.speculative.execution=true; mapred.reduce.task.speculative.execution=false;
- task执行时间很短的时候,关闭推测执行(否则可能会有约5%的task被kill掉,而你会观察到通常kill的是因推测执行而额外启动的tasks)。
- 在map时间很长,而map的输出数据并不大的时候,推迟reduce执行时间(否则在推测执行打开的时候会看到有大量的reduce task attempts因过早启动而被kill掉,过早启动会导致集群资源被浪费),这个由mapred.reduce.slowstart.completed.maps[default 0.05,即5%]控制,我甚至看到有的job因为这个kill掉了2*reduceNum以上的task attempts。集群把这个参数设置为0.75应该比较合适。
mapred.reduce.slowstart.completed.maps=0.80
- 当task数量非常多而且通常很短[约1min]的时候,把JVM重用开启,由mapred.job.reuse.jvm.num.tasks[default 1]控制,这通常能获得10%