java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO $ Windows.createDirectoryWithMode0

时间:2018-07-11 09:42:56

标签: java maven hadoop cloudera-cdh

我无法解决此异常,我已经阅读了hadoop docu和我可以找到的所有相关的stackoverflow问题。

我的fileSystem.mkdirs(***)抛出:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V
    at org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Native Method)
    at org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode(NativeIO.java:524)
    at org.apache.hadoop.fs.RawLocalFileSystem.mkOneDirWithMode(RawLocalFileSystem.java:465)
    at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:518)
    at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:496)
    at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:316)
...

我在我的应用程序中包含以下依赖项(通过maven pom.xml),都在2.6.0-cdh5.13.0版本中:hadoop-common,hadoop-hdfs,hadoop-client,hadoop-minicluster

我的文件系统变量是有效的(hadoop通用)文件系统(org.apache.hadoop.fs.FileSystem)。

我从https://github.com/steveloughran/winutils/tree/master/hadoop-2.6.0/bin下载了hadoop文件。 我将版本2.6.0中的winutils.exe和所有其他文件存储到C:\ Temp \ hadoop \ bin下的本地文件系统中。 我在路径变量HADOOP_HOME中添加了C:\ Temp \ hadoop(是的,不是bin目录的路径)。

未使用后备广告(“使用内建的Java类”),我得到:

145 [main] DEBUG org.apache.hadoop.util.NativeCodeLoader  - Trying to load the custom-built native-hadoop library...
147 [main] DEBUG org.apache.hadoop.util.NativeCodeLoader  - Loaded the native-hadoop library

(请参见https://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/NativeLibraries.html

我了解到,此异常可能是由于hadoop版本不匹配引起的,但是我检查了导入的hadoop是否与我本地存储的hadoop匹配,版本明智。

我正在Windows 10 x64系统和IntelliJ中工作。

每个人都有一个主意,我可以检查甚至是我做错了什么?

更新: 我使用以下VM选项运行主服务器

-Dhadoop.home.dir=C:/Temp/hadoop
-Djava.library.path=C:/Temp/hadoop/bin

不指定lib路径,我得到:

org.apache.hadoop.util.NativeCodeLoader  - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

4 个答案:

答案 0 :(得分:3)

对我来说,设置VM参数-Djava.library.path = C:\ devTools \ winutils-master \ hadoop-3.0.0 解决了这个问题。

答案 1 :(得分:1)

此异常的原因是:

我正在通过maven pom导入 2.6.0-cdh5.13.0 ,但是我下载了版本为 2.6.0 的预构建文件。这些都缺少cdh5.13.0变体(CDH是Cloudera的平台,其中包括Hadoop生态系统)所做的更改。因此,这些版本确实存在冲突。

如果我导入hadoop-common,hadoop-hdfs,hadoop-client像2.6.0而不是2.6.0-cdh5.13.0一样,该异常消失(而且我甚至不需要设置VM选项)。

请参见http://archive-primary.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.13.0/hadoop-project-dist/hadoop-common/NativeLibraries.html

答案 2 :(得分:0)

从hadoop-3.0.0下载hadoop.dll和winutils.exe文件并得到解决

https://github.com/steveloughran/winutils/tree/master/hadoop-3.0.0/bin

答案 3 :(得分:-1)

检查您的Java版本。如果Java是32位版本,则需要卸载并使用hadoop的64位版本重新安装。

检查命令:

java -d32 -version;(如果为32版本,则没有错误)

java -d64 -version;(如果为64版本,则没有错误)