windows下运行spark程序报错:Failed to locate the winutils binary in the hadoop binary path

我就是我 2022-05-27 02:36 268阅读 0赞

之前在mac上调试hadoop程序(mac之前配置过hadoop环境)一直都是正常的。因为工作需要,需要在windows上先调试该程序,然后再转到linux下。程序运行的过程中,报Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

通过断点调试、查看源码发现程序需要根据HADOOP_HOME找到winutils.exe,由于win机器并没有配置该环境变量,所以程序报 null\bin\winutils.exe。

  1. private static String checkHadoopHome() {
  2. // first check the Dflag hadoop.home.dir with JVM scope
  3. String home = System.getProperty("hadoop.home.dir");
  4. // fall back to the system/user-global env variable
  5. if (home == null) {
  6. home = System.getenv("HADOOP_HOME");
  7. }
  8. try {
  9. // couldn't find either setting for hadoop's home directory
  10. if (home == null) {
  11. throw new IOException("HADOOP_HOME or hadoop.home.dir are not set.");
  12. }
  13. if (home.startsWith("\"") && home.endsWith("\"")) {
  14. home = home.substring(1, home.length()-1);
  15. }
  16. // check that the home setting is actually a directory that exists
  17. File homedir = new File(home);
  18. if (!homedir.isAbsolute() || !homedir.exists() || !homedir.isDirectory()) {
  19. throw new IOException("Hadoop home directory " + homedir
  20. + " does not exist, is not a directory, or is not an absolute path.");
  21. }
  22. home = homedir.getCanonicalPath();
  23. } catch (IOException ioe) {
  24. if (LOG.isDebugEnabled()) {
  25. LOG.debug("Failed to detect a valid hadoop home directory", ioe);
  26. }
  27. home = null;
  28. }
  29. return home;
  30. }
  31.   private static String HADOOP_HOME_DIR = checkHadoopHome();
  32. public static final String getQualifiedBinPath(String executable)
  33. throws IOException {
  34. // construct hadoop bin path to the specified executable
  35. String fullExeName = HADOOP_HOME_DIR + File.separator + "bin"
  36. + File.separator + executable;
  37. File exeFile = new File(fullExeName);
  38. if (!exeFile.exists()) {
  39. throw new IOException("Could not locate executable " + fullExeName
  40. + " in the Hadoop binaries.");
  41. }
  42. return exeFile.getCanonicalPath();
  43. }
  44. /** a Windows utility to emulate Unix commands */
  45. public static final String WINUTILS = getWinUtilsPath();
  46. public static final String getWinUtilsPath() {
  47. String winUtilsPath = null;
  48. try {
  49. if (WINDOWS) {
  50. winUtilsPath = getQualifiedBinPath("winutils.exe");
  51. }
  52. } catch (IOException ioe) {
  53. LOG.error("Failed to locate the winutils binary in the hadoop binary path",
  54. ioe);
  55. }
  56. return winUtilsPath;
  57. }

找到原因后就去网上问了度娘,找到了解决方案,很简单,如下:

  1. 下载winutils的windows版本
      GitHub上,有人提供了winutils的windows的版本,项目地址是:https://github.com/srccodes/hadoop-common-2.2.0-bin,直接下载此项目的zip包,下载后是文件名是hadoop-common-2.2.0-bin-master.zip,随便解压到一个目录
  2. 配置环境变量
      增加用户变量HADOOP_HOME,值是下载的zip包解压的目录,然后在系统变量path里增加%HADOOP_HOME%\bin 即可。  
  3. 重启开发工具idea,再次运行程序,正常执行。

本文转载自博客园文章:WIN7下运行hadoop程序报:Failed to locate the winutils binary in the hadoop binary path

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读