解决下面两种异常的思路及其方案:
一: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目录而且里面有这两个文件,后续有因为这个错误的话再回来总结