问题描述
发现一个正常运行的hive任务突然失败了,如下图:
主要是由于map有任务失败导致整个MR失败了,查看map的log,发现:
java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1032241758-10.196.145.165-1488796558087:blk_5010798078_3937163083
file=/user/xxx/warehouse/xxx.db/xxx/attempt_1470375164689_38810454_r_000107_0.1472337270529
从上面报错信息可知是由于hdfs丢块导致map的IO异常,最终导致整个任务失败。
问题处理
一般来说hdfs的数据都会有多备份,是比较少出现丢块问题的,出现丢块一般有下面两种情况:
- 如果同时有好几台机器出现故障,而刚好这个块及其备份数据又都在这几台机器上
- 数据块刚生成好,还没来得及复制备份,刚好所在的机器出现了故障
针对hdfs丢块问题,主要有两种解决思路:
- 尽快恢复机器,解决丢块问题,使MR任务可以正常运行。
- 如果MR的计算的数据量很大,而丢失的块的数据占比又很小且对MR的统计结果影响很小,在这种情况下,我们可以在MR任务中放弃丢失块的数据(在大数据的统计中,我们通常只需要有一个准确的结果,而不需要一个精确的值,比如给决策人员算一个日登录人数,可能他只需要一个精确到万的数就可以了,而不是一定要一个精确到个位的数)
如果是这种情况,可能通过调mapreduce参数还控制允许map失败个数的百分比来规避丢块的问题
set mapreduce.map.failures.maxpercent=5
上面参数设置了map阶段允许失败5%的map,MR任务可以正常执行。