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");
}
}
}
运行输出:
果然是不行,然后再查一下的System.loadLibrary()
用法,发现可能是JDK位数的问题。
于是立马在CMD
查看当前的JDK位数:
java -version
得到这样的结果:
果然是32 bit
(输出信息中虽然没有说明 32 bit
还是 64 bit
的,实际就是32 bit
),那就找一个64 bit
的。
(操作过程略)
安装好之后,再看位数:
好了,再次测试:
可以了,真是激动人心。
重新运行MapReduce
程序,成功!
03 后记
碰到问题还是需要多Debug
。
参考:
Windows下Hadoop客户端:winutils
System.loadLibrary()
使用:java system.load 动态链接库报错
JDK各版本下载:华为镜像库