解决Windows环境下“org.apache.hadoop.io.nativeio.NativeIOException: 当文件已存在时,无法创建该文件”错误

解决Windows环境下“org.apache.hadoop.io.nativeio.NativeIOException: 当文件已存在时,无法创建该文件”错误,第1张

解决Windows环境下“org.apache.hadoop.io.nativeio.NativeIOException: 当文件已存在时,无法创建该文件”错误

文章目录
  • 1 错误描述
  • 2 原因分析
  • 3 解决方案

1 错误描述

本机windows系统,hadoop3.2.2版本。在运行MapReduce任务的时候报“org.apache.hadoop.io.nativeio.NativeIOException: 当文件已存在时,无法创建该文件”错误,但是该错误不影响MR任务的执行结果。

2 原因分析

直接根据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}
        
    
    
        
    

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5688919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存