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

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各版本下载:华为镜像库

### 回答1: 这是一个Java错误,表示在调用org.apache.hadoop.io.nativeio.nativeio$windows.access(ljava/lang/string;i)z时出现了问题。这个错误通常是由于缺少本地库或本地库无法加载而引起的。要解决这个问题,您需要确保本地库已正确安装并且可以被Java虚拟机加载。您还可以尝试重新安装Hadoop并确保所有依赖项都已正确安装。 ### 回答2: Java.lang.unsatisfiedlinkerror是Java程序中的一个常见异常,它通常发生在Java代码中的native方法调用时,表示此方法的本地代码实现在运行时找不到。在这个问题中,具体的错误信息是:org.apache.hadoop.io.nativeio.nativeio$windows.access0(ljava/lang/string;i)z。 这个错误信息告诉我们,出错的地方是org.apache.hadoop.io.nativeio包中的windows.access0方法,这个方法的参数包括一个字符串和一个整数,返回值类型是布尔值。接下来展示的是Windows平台下访问本地IO的一些操作。 首先,我们需要确定这个问题的根本原因。最常见的触发这个异常的原因是本地库或动态链接库文件缺失或损坏。这意味着,程序需要调用本地库文件,但找不到或无法使用这个文件,因此出现了错误。 要解决这个问题,我们可以考虑使用以下方法: 1.确定Java代码中调用的方法是否需要本地库文件作为依赖,并检查依赖文件是否与程序一起打包并正确部署。 2.检查本地库文件是否存在于Java.library.path所指定的目录中,并确保路径是正确的。例如,如果使用了hadoop-winutils库,请确保此库存在于可执行文件的路径中。 3.如果程序需要动态链接库文件,请检查文件是否已经正确安装,并检查环境变量是否正确配置。例如,在Windows环境中,PATH变量通常需要包含动态链接库文件路径,以便应用程序可以找到库文件。 4.尝试使用JVM参数-Djava.library.path来指定本地库文件路径。可以将此参数添加到应用程序的启动脚本中,或通过使用Java命令行界面来传递该参数。 总之,当Java程序中出现“java.lang.unsatisfiedlinkerror: org.apache.hadoop.io.nativeio.nativeio$windows.access0(ljava/lang/string;i)z”这个错误时,我们需要确认本地库文件是否被正确引用并部署,检查环境变量是否设置正确,并且尝试使用JVM参数指定本地库文件路径。这些步骤将有助于解决这个问题。 ### 回答3: 这是一个十分常见的错误,通常出现在使用Hadoop或者Spark等大数据框架时。其中,java.lang.unsatisfiedlinkerror表示在Java应用程序中找不到本地库文件,原因是调用的方法无法从Java虚拟机找到本地实现。 具体地,这个错误是因为在Windows系统上运行Hadoop程序时无法加载hadoop.dll文件造成的。hadoop.dll是在使用Hadoop的本地文件系统时需要的动态链接库文件。解决这个问题,一般有以下几种方法: 1.hadoop.dll文件复制到%WINDOWS%/System32文件夹下。这可以让系统知道要在该文件夹下搜索hadoop.dll文件。 2.hadoop.dll文件复制到Hadoop库文件夹下即可。可以从Hadoop官网下载对应的hadoop.dll文件,然后将其复制到Hadoop的库文件夹中即可。 3. 检查系统环境变量。有时候,系统环境变量并没有正确配置,这就会导致无法找到hadoop.dll文件。可以检查Path环境变量是否已包括hadoop.dll文件所在路径。 总之,java.lang.unsatisfiedlinkerror实际上是由于Java应用程序无法找到本地库文件而引起的。在Hadoop程序中,这个错误通常是由于无法加载hadoop.dll文件造成的。我们可以尝试使用上述的方法解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值