- 1 错误描述
- 2 原因分析
- 3 解决方案
本机windows系统,hadoop3.2.2版本。在运行MapReduce任务的时候报“org.apache.hadoop.io.nativeio.NativeIOException: 当文件已存在时,无法创建该文件”错误,但是该错误不影响MR任务的执行结果。
直接根据log信息,发现抛出异常的位置在RawLocalFileSystem类的mkOneDirWithMode方法中。且这里可以看到异常信息与控制台的异常信息相符。
p2d参数的值为:
tmphadoopmapredstagingAdministrator1872014343.stagingjob_local1872014343_0001
这里try-catch的捕获异常的代码块只有一行关键代码,那就是:
NativeIO.Windows.createDirectoryWithMode(p2f, permission.toShort());
查看该方法的实现,发现最终是一个native方法。根据注释可以知道,该方法是创建一个目录,但是如果目录已经存在,那么将会抛出IOException。这就是异常的由来。
对方法调用进行溯源,可以发现在本地提交MR任务的JobSummitter中,创建MR工作工空间以及拷贝MR任务配置文件、创建output文件等都调用了该native方法。
3 解决方案在异常处理代码中,有一个判断LOG的日志级别的条件,那就是如果日志级别是debug,那么就会打印这个日志。这里就是入手点。
项目的日志框架排除了log4j,采用logback(logback日志级别默认为debug)。只需要将在logback.xml日志文件中将日志的level设置为info或以上级别即可。
UTF-8 ${CONSOLE_LOG_PATTERN}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)