问题现象:
执行mapreduce程序(根据增量文件对全量文件实行更新操作)时,设置参数mapreduce.job.reduces=200,程序执行成功后,结果目录下面除了_SUCCESS文件外,总共只有198个文件(每个文件300多M),缺少文件part-r-00119及part-r-00125. 重新执行程序后,正确生成200个结果文件。
问题分析过程:
1. 查看8088界面,发现作业运行成功,200 个reduce task 均已成功执行,其中reduce_119及reduce_125 任务均为一次执行成功,没有出现failed及killed;
2. 查看yarn日志,根据File System Counters中记录信息,Reduce output records=212759958大于实际结果文件中的记录条数;
3. 查看reduce 119 task的日志信息,发现以下信息
2017-03-10 08:23:15,560 INFO [main] org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter: Saved output of task 'attempt_1478381467748_149540_r_000119_0' to hdfs://mycluster/XXX/XXX/XXX/20170227/_temporary/1/task_1478381467748_149540_r_000119
2017-03-10 08:23:15,620 INFO [main] org.apache.hadoop.mapred.Task: Task 'attempt_1478381467748_149540_r_000119_0' done.
上述信息表明reduce_119 task已经成功生成结果临时文件并将成功执行的状态返回给了APPMASTER;
4. 继续分析reduce_119 task的结果临时文件在之后为何会丢失。
到该task所运行的datanode节点找到该临时文件的某一BOLOCK NAME,并到namenode节点查看该块的所有操作信息,
发现2017-03-10 08:26时该块信息被删除(该task运行成功时间为2017-03-10 08:23,整个JOB运行成功时间为2017-03-10 09:30左右) PS:文件进行MV操作时,BOLOCK NAME不会发生变化;
5. 查看源码发现,task生成的结果临时文件被移动至目标结果目录采用的是rename操作;
6. 做了以下测试分析:
执行相同程序,在reduce_121 task执行成功后(整个job并未执行完成), 手动将该task生成的结果临时文件hdfs://mycluster/XXX/XXX/XXX/20170227/_temporary/1/task_1478381467748_149540_r_000121进行删除;神奇的事情发生了,整个job作业运行成功了,但是结果目录缺少了part-r-00121这个文件,且File System Counters中记录的输出结果信息是包含part-r-00121这个文件记录条数的
分析到了这里实在是不知道为啥结果临时文件的block信息被删除了,
跪求大神帮忙分析分析问题原因,为啥mapreduce执行过程中会丢失结果文件;
PS:
1. hadoop 版本:hadoop 2.2.0
2. 操作系统 red hat
3. 程序执行过程中,不存在人为删除reduce_119 和 reduce_125 task 临时结果文件的情况