MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO $ Windows.access0

时间:2018-07-17 13:31:57

标签: java maven hadoop hdfs junit5

这样做时:

new MiniDFSCluster.Builder(config).build()

我收到此异常:

java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)
at org.apache.hadoop.fs.FileUtil.canWrite(FileUtil.java:996)
at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:490)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:308)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:202)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1020)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:739)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:536)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:595)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:762)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:746)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1438)
at org.apache.hadoop.hdfs.MiniDFSCluster.createNameNode(MiniDFSCluster.java:1107)
at org.apache.hadoop.hdfs.MiniDFSCluster.createNameNodesAndSetConf(MiniDFSCluster.java:978)
at org.apache.hadoop.hdfs.MiniDFSCluster.initMiniDFSCluster(MiniDFSCluster.java:807)
at org.apache.hadoop.hdfs.MiniDFSCluster.<init>(MiniDFSCluster.java:467)
at org.apache.hadoop.hdfs.MiniDFSCluster$Builder.build(MiniDFSCluster.java:426)

我想使用Hadoop Minicluster测试我的Hadoop HDFS(不会抛出此异常,请参见java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0)。

在我的Maven pom.xml中,我具有以下依赖性:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.6.0</version>
</dependency>

<!-- for unit testing -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.6.0</version>
    <type>test-jar</type>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.6.0</version>
</dependency>

<!-- for unit testing -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.6.0</version>
    <scope>test</scope>
    <classifier>tests</classifier>
</dependency>

我了解,我不需要特定的“ hadoop-minicluster”依赖项,因为上面包含的hadoop-hdfs已经附带了它。

我正在尝试在我的@BeforeAll中构建MiniDFSCluster。

我为构建器使用了不同的配置:

config = new HdfsConfiguration(); / config = new Configuration();

以及为baseDir创建路径的不同方法:

config.set(miniDfsClusterHD.HDFS_MINIDFS_BASEDIR, baseDir);

此外,我在v2.6.0中下载了hadoop.dll,hdfs.dll和winuntils.exe,并在我的环境变量中添加了它们的路径。

我研究了我可以在stackoverflow中找到的所有相关问题(显然没有成功),以及我可以在互联网上找到的所有指南和代码示例(有一些指南和代码示例的用法不同)。

能以某种方式请我帮忙,我没主意了。

更新:

我正在使用以下VM选项运行测试(我认为应该没有必要):

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

我还尝试直接设置环境变量(使用VM选项时不必设置):

System.setProperty("hadoop.home.dir", "C:\\Temp\\hadoop-2.6.0");
System.setProperty("java.library.path", "C:\\Temp\\hadoop-2.6.0\\bin");

1 个答案:

答案 0 :(得分:0)

我通过下载源文件(org.apache.hadoop.io.nativeio.NativeIO.java)并修改了 从以下位置访问功能(在您的情况下为557):

return access0(path, desiredAccess.accessRight());

return true;