【问题标题】:java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0
【发布时间】:2018-07-11 09:42:56
【问题描述】:

我无法解决这个异常,我已经阅读了 hadoop 文档和我能找到的所有相关的 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-common)文件系统(org.apache.hadoop.fs.FileSystem)。

我从https://github.com/steveloughran/winutils/tree/master/hadoop-2.6.0/bin 下载了hadoop 文件。 我将 winutils.exe 和 2.6.0 版中的所有其他文件存储到 C:\Temp\hadoop\bin 下的本地文件系统中。 我用 C:\Temp\hadoop 添加了路径变量 HADOOP_HOME(是的,不是 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 选项运行我的 main

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

不指定库路径,我得到:

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

【问题讨论】:

  • 问题在于本机库的版本,即.DLL 文件。也许,不同的版本在某个路径条目(PATH 或当前目录)中的某处。
  • 感谢 Holger,我查过了,但没有。
  • 嗯,但您的解决方案表明这正是问题所在。由于设置而不是附加意味着不允许在其他前面的路径组件之一中找到库。您可以使用Process Monitor 找出进程实际加载的库。

标签: java maven hadoop cloudera-cdh


【解决方案1】:

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

【讨论】:

  • 也适合我。谢谢!
【解决方案2】:

这个异常的原因是:

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

如果我像 2.6.0 而不是像 2.6.0-cdh5.13.0 那样导入 hadoop-common、hadoop-hdfs、hadoop-client,异常就会消失(我什至不需要设置 VM 选项)。

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

【讨论】:

    【解决方案3】:

    检查您的 java 版本。如果java是32位版本,需要卸载重装hadoop的64位版本。

    检查命令:

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

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

    【讨论】:

      【解决方案4】:

      从 hadoop-3.0.0 下载 hadoop.dll 和 winutils.exe 文件并解析

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

      【讨论】:

      • 它是如何解决上述问题的?你是在什么情况下发生的?请详细说明,见How To Answer
      【解决方案5】:

      我在 spark 中编写 parquet 文件时遇到了同样的问题。从 hadoop-3.0.0 下载 hadoop.dll 和 winutils.exe 文件并将 hadoop.dll 移动到 C:\Windows\System32 文件夹并将 winutils.exe 移动到 C:\hadoop\bin 文件夹解决了我的问题。

      感谢 Shailendra Singh 分享上述链接

      【讨论】:

      • Shailendra 已经给出了这个答案。它应该是评论(您需要为此赢得声誉)或对 Shailendra 答案的编辑。
      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2018-12-25
      • 2011-03-18
      相关资源
      最近更新 更多