12

我正在尝试使用 Hadoop 2.2 运行一个简单的 JUnit 测试。在我的 Windows 7 机器上。我在http://grepalex.com/2012/10/20/hadoop-unit-testing-with-minimrcluster/上有一个示例性测试,所以我使用 ClusterMapReduceTestCase 作为基类来启动 MiniDFSCluster。

运行测试时我得到(在控制台中):

2013-11-15 11:59:24,636 错误 [main] util.Shell (Shell.java:getWinUtilsPath(303)) - 无法在 hadoop 二进制路径 java.io.IOException 中找到 winutils 二进制文件:找不到可执行文件 null \bin\winutils.exe 在 Hadoop 二进制文件中。在 org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:278) 在 org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:300) 在 org.apache.hadoop.util.Shell.( Shell.java:293) 在 org.apache.hadoop.util.StringUtils.(StringUtils.java:76) (...)

在 JUnit 输出中:

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 ) 在 org.apache.hadoop.fs.FileUtil.canWrite(FileUtil.java:996) 在 org.apache.hadoop 的 org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:435)。 hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:451) 在 org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:282) 在 org.apache.hadoop.hdfs。 server.namenode.FSImage.recoverTransitionRead(FSImage.java:200) (...)

我已经阅读了以下线程:无法在 hadoop 二进制路径中找到 winutils 二进制文件在 Windows 上运行 Apache Hadoop 2.1.0 我还查看了http://www.srccodes.com上提供的可能解决方案/p/article/38/build-install-configure-run-apache-hadoop-2.2.0-microsoft-windows-oshttp://www.srccodes.com/p/article/39/error-util-shell -failed-locate-winutils-binary-hadoop-binary-path

不幸的是,这在 JUnit 测试的情况下不起作用。如果我编写 junit 测试,我希望它们独立于开发环境(这样你就可以在每台开发机器上毫无问题地运行)。因此,我使用的是 maven,我不想自己构建所需的库并将它们放在 Hadoop bin 文件夹等中。

任何建议在这种情况下最好的解决方案是什么?

4

1 回答 1

0

自发布答案以来,Hadoop 3 已经问世。但是,重点仍然放在非 Windows 系统上。基于页面,甚至 Microsoft 的分发版也不再在 Windows 上可用。

尽管测试是另一回事,但结果是 Windows 的测试不太可能受到很多人的喜爱,仍然需要一种解决方法。

这个答案,被接受回答一个非常相似的问题,关键步骤:

  1. 从http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe下载 winutils.exe 。
  2. HADOOP_HOME在操作系统级别或以编程方式设置您的环境变量:System.setProperty("hadoop.home.dir", "full path to the folder with winutils");

如果这对人们来说仍然是一个重要的话题,请注意在堆栈溢出上发布可能无济于事(如果有更好的解决方案,现在可能已经有人发布了)。相反,我建议他们在hadoop jira上记录请求,并在此处的评论中添加指向它的链接以避免重复。

于 2020-08-01T22:26:22.313 回答