Hadoop开发——异常处理:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

01 前言

最近在学习Hadoop,进行MapReduce练习,使用本地模式进行调试,碰到报错:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z。查了一些资料,根据步骤操作:
1、正确配置HADOOP_HOME环境变量
2、将hadoop.dll复制到C:\Windows\System32
还是没有解决,看到还有一种方法是修改源代码:NativeIO类,那这种办法肯定是可以的。
本着实事求是的精神,想排查一下到底是为啥造成这个异常。于是在IDE中一顿Debug,找到了问题根源,记录一下。

02 正文

环境:

Windows 11 64 bit
Jdk 1.8 64 bit(问题在这里,原来是32 bit,需要换成64 bit,与操作系统位数对应)
Idea
Hadoop 3.4.1 (pom.xml中)
Hadoop 3.3.6 (Windows本地客户端,即winutils版本)

这两步还是要做的:
1、配置HADOOP_HOME环境变量
2、将hadoop.dll复制到C:\Windows\System32

这两步的过程略,可以参考其他文章,这里主要说一下Debug过程。


一路Debug下来,看到org.apache.hadoop.util.NativeCodeLoader类中有这样一段代码:

static {
    //...以上略
    try {
      System.loadLibrary("hadoop"); 
      LOG.debug("Loaded the native-hadoop library");
      nativeCodeLoaded = true;
    } catch (Throwable t) {
      // Ignore failure to load
      if(LOG.isDebugEnabled()) {
        LOG.debug("Failed to load native-hadoop with error: " + t);
        LOG.debug("java.library.path=" +
            System.getProperty("java.library.path"));
      }
    }
    //... 以下略
}

问题就出在System.loadLibrary("hadoop"); 这一行,加载hadoop.dll异常,那么就单独拿出来试一下。
创建一个main方法测试:

public class Main {
    public static void main(String[] args) {
        try {
            System.loadLibrary("hadoop");
            System.out.println("Hadoop loaded");
        } catch (Throwable t) {
            System.out.println("Hadoop failed");
        }

    }
}

运行输出:
failed

果然是不行,然后再查一下的System.loadLibrary()用法,发现可能是JDK位数的问题
于是立马在CMD查看当前的JDK位数:

java -version

得到这样的结果:
32 bit

果然是32 bit(输出信息中虽然没有说明 32 bit 还是 64 bit的,实际就是32 bit),那就找一个64 bit的。

(操作过程略)

安装好之后,再看位数:
64 bit
好了,再次测试:
loaded
可以了,真是激动人心。
重新运行MapReduce程序,成功!
运行

03 后记

碰到问题还是需要多Debug

参考:
Windows下Hadoop客户端:winutils
System.loadLibrary()使用:java system.load 动态链接库报错
JDK各版本下载:华为镜像库

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐