目前碰到过三种缘由致使 Time out after 300 secs。正则表达式
1. 死循环spa
这是最多见的缘由。显式的死循环很容易定位,隐式的死循环就比较麻烦了,好比正则表达式。曾经用一个网上抄来的邮箱正则表达式匹配百亿条数据,最终致使一个map阶段的attempt频繁超时重试,最后本身重写了一个简化版的表达式,问题解决。对象
2. 频繁GCip
程序中生成了过多的全局对象会致使频繁GC。好比reduce阶段依赖一个不断增大的ArrayList变量,而ArrayList在增大过程当中涉及到不断的copyOf,造成额外的时间和空间开销,最终致使任务超时。解决方法:任务提交时动态配置 -D mapreduce.reduce.memory.mb=5120 参数,增大reduce阶段内存。内存
3. 节点崩溃class
这种比较少见,并且通常会出如今reduce阶段。由于map阶段的中间结果是保存在计算节点本地的,所以数据只有单一备份。若是reduce阶段时某个节点崩溃,会致使reduce计算节点没法获取该map节点的数据,形成Bad response ERROR for block。解决办法很简单,从新跑一次就行了。变量
补充:若是容许丢掉部分异常数据的话,能够设置 mapreduce.map.skip.maxrecords 和 mapreduce.reduce.skip.maxgroups 两个参数,分别表示map阶段能够跳过的最大错误记录数和reduce阶段能够跳过的最大错误组数。配置