今天发现一个日常任务突然失败失败的原因也不明显,因为这个hive sql会生成多个mapreduce任务前面的mapreduce任务都成功了,到最后一个MR任务的时候在任务启动之前就失败了,因此不能通过mapreduce任务监控页面来查找问题后面通过hive的session日志,发现了如下错误信息:
上面提示可以知道错误发生在hive sql的多个mapreduce任务之间,因为这个sql总共會执行3个MR任务而在执行完第2个MR任务的时候,sql就结束执行了另外也可以通过上面打印的路径可以知道,因为hive sql的中间数据会存放在hive表的路徑的default文件夹中
由上面信息可以知道是由于中间数据产生了大量的文件,导致split超过了size最终导致了IOException
总结一下就是:hive任务中间数据产生大量尛文件,导致split超过了size引起了任务失败。
既然失败原因弄清楚了那就解决问题了,通过源码可以找到
问题是解决了但是却让我产生了疑问:为什么hadoop要设置BlockLocations呢?
这里有一个比较好的回答:
同时也可以通过hadoop的Issues列表中的可以知道设置这个参数的大致原因