java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativei



我无法解决这个异常,我已经阅读了hadoop文档和所有相关的stackoverflow问题。

我的文件系统.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)
...

我在我的应用程序中包含了以下依赖项(通过mavenpom.xml(,所有这些都在2.6.0-cdh5.13.0版本中:hadoop-common、hadoop-hdfs、hadoop-client、hadoop-minicluster

我的文件系统变量是一个有效的(hadoop-common(filesystem(org.apache.hadop.fs.filesystem(

我从下载了hadoop文件https://github.com/steveloughran/winutils/tree/master/hadoop-2.6.0/bin.我将2.6.0版本中的winutils.exe和所有其他文件存储在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是否与我在本地存储的版本匹配。

我正在使用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

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

此异常的原因是:

我正在通过maven pom导入2.6.0-cdh5.13.0,但我下载了22.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

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

检查命令:

java-d32-版本;(如果是32版本,则无错误(

java-d64-版本;(如果是64版本,则无错误(

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

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

在我的案例中,问题是我在system32中有hadoop.dll,如果你在windows上运行hadoop,他在System32或hadoop_HOME\bin中找到了hadoop.dll,那么他认为这是一个集群,问题是集群与windows不兼容,所以它失败了。

解决方案从System32和hadoop_HOME\bin 中删除hadoop.dll

请参阅:完整答案

有这个问题,结果HADOOP_HOME被设置为2.6.4版本的文件夹。将它更新到3.0.0文件夹,它就工作了。通常,您必须在调用端使用-Djava.library.path更新它,或者在环境设置中将其更新为3.0.0。

对于环境变量,HADOOP_HOME是一个系统环境变量,您可以通过命令访问

rundll32.exe sysdm.cpl, EditEnvironmentVariables

这可以输入⊞+R(windows键+R(,然后输入ctrl+shift,或者以管理员身份打开powershell或cmd。

从这里开始,我将系统环境变量HADOOP_HOME编辑到3.0.0文件夹中,并将系统PATH更新为HADOOP_HOME/bin。请确保您的用户变量中没有冲突,例如在PATH中。

之后,任何调用Spark的终端或程序都应该重新启动并检查,以确保它加载了新的环境变量。

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

感谢Shailendra Singh分享上述链接

相关内容

最新更新