org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(LjavalangString;I)Z解决方案

    科技2022-08-18  92

    解决下面两种异常的思路及其方案:

    一:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 二:(null) entry in command string: null chmod 0700

    发现问题:在windows上运行WordCount程序报错Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z,但是在Linux上运行正常

    1. 发现一篇帖子说:缺少hadoop.dll和 winutils.exe

    第一步:按照网上的方法本地hadoop的bin目录下缺少hadoop.dll 和 winutils 这两个东西,经过一顿操作把这两个文件放到hadoop的bin目录下依然不行

    2. 发现一篇帖子说:将hadoop.dll文件放到C:\Windows\System32

    这一步的时候我很疑惑,因为在环境变量中PATH引用了hadoop的bin目录,为什么hadoop.dll会读不到呢,不管了经过一顿操作重启了几遍依然不行,

    3. 发现一篇帖子说:将winutils文件也放到C:\Windows\System32

    这个时候也很疑惑但是一顿操作重启好几次依然不行

    4. 发现一篇帖子说:改这个NativeIO.Class的源码直接改成true

    这个时候也很懵逼,搞个hadoop还要改源码??官方代码不好使,这么水的吗???反正一顿操作还是不行

    5. 发现一篇帖子说:在程序中指定hadoop.home.dir

    System.setProperty("hadoop.home.dir","hadoop的文件路径" );依然花里胡哨搞了一遍没用

    6. 发现一篇帖子说:在程序中强制加载bin目录下的hadoop.dll

    System.load("D:\hadoop2.7.5\bin\hadoop.dll");这个看起来有些靠谱但就这个时候发现一个没见过的错误

    Can't load AMD 64-bit .dll on a IA 32-bit platform 翻译:无法在IA 32位平台上加载AMD 64位.dll

    这个错误直接把我搞蒙了,因为本机是64位怎么会识别成是32位的呢。

    7. 发现一篇帖子说:C:\Windows\System32这个目录不行要使用C:\Windows\SysWOW64

    把hadoop.dll和winutils放到这个目录下重启依然报错

    8. 经过短暂的思考后

    Can't load AMD 64-bit .dll on a IA 32-bit platform这个问题描述的32位指的不是本机而是运行环境,打开cmd窗口,输入java -version发现jdk是32位的(没有显示64-Bit就代表是32位的) ,打开Linux检查java版本是64位,这个时候卸载32位的jdk,安装64位版本,WordCount运行成功

    总结:

    检查环境变量是正确,jdk版本等运行环境系统位数是否对应检查bin下面是否有hadoop.dll和winutils,经过测试没有这2个文件报错我这里本机测试system32下没有hadoop.dll和winutils文件也不会报错,因为环境变量中已经引用到了bin目录而且里面有这两个文件,后续有因为这个错误的话再回来总结
    Processed: 0.033, SQL: 9