【问题原因】
写小数据量没问题。大数据量才会出现该问题,是因为hdfs写文件是多进程写,不同hdfs client写文件时需要申请文件锁,也就是hadoop的lease租约机制。由于写的数据量大,hadoop yarn集群默认在task任务的map或reduce阶段开启了预测机制来分配资源或进程,进而导致文件写时导致文件输出流异常关闭,客户端进程无法创建文件。
当出现数据倾斜时,mapreduce 阶段会出现掉队者,掉队者是指那些跑的很慢但是最终可以执行成功的任务。此时 mapreduce 的推测机制会生效,可以识别那些跑的任务比较慢的任务,但是不会清理掉队者的任务,而是会产生另一个等效的任务作为备份,并使用首先完成的那个任务的结果,这种技术称为推测执行(speculative execution)。
这种机制是为了保证 mapreduce 的执行效率,但是当操作 hdfs 文件时,如果出现同时写操作,hdfs 的 lease 管理员是不允许同时被两个写入程序占用的。
【解决办法】
将mapred-site.xml配置文件里的mapreduce.map.speculative和
mapreduce.reduce.speculative参数的值均改为false,重启hadoop即可解决。