【问题标题】:MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO$Windows.access0MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO$Windows.access0
【发布时间】:2018-12-25 05:38:10
【问题描述】:

做的时候:

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");

【问题讨论】:

  • 这里有同样的问题。你能解决它吗?
  • 不,我没有,我想:-/
  • 在我的情况下,我注意到设置以下 VM 选项:-Djava.library.path=C:/Temp/hadoop/bin 解决了以下问题使用 IntelliJ 的 runner 运行测试。但在使用 mvn test 时却没有

标签: java maven hadoop hdfs junit5


【解决方案1】:

我已经通过下载源文件 (org.apache.hadoop.io.nativeio.NativeIO.java) 并修改行来解决这个问题 功能访问(在您的情况下为 557)来自:

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

return true;

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多