之前在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。
private static String checkHadoopHome() { // first check the Dflag hadoop.home.dir with JVM scope String home = System.getProperty("hadoop.home.dir"); // fall back to the system/user-global env variable if (home == null) { home = System.getenv("HADOOP_HOME"); } try { // couldn't find either setting for hadoop's home directory if (home == null) { throw new IOException("HADOOP_HOME or hadoop.home.dir are not set."); } if (home.startsWith("\"") && home.endsWith("\"")) { home = home.substring(1, home.length()-1); } // check that the home setting is actually a directory that exists File homedir = new File(home); if (!homedir.isAbsolute() || !homedir.exists() || !homedir.isDirectory()) { throw new IOException("Hadoop home directory " + homedir + " does not exist, is not a directory, or is not an absolute path."); } home = homedir.getCanonicalPath(); } catch (IOException ioe) { if (LOG.isDebugEnabled()) { LOG.debug("Failed to detect a valid hadoop home directory", ioe); } home = null; } return home; }
private static String HADOOP_HOME_DIR = checkHadoopHome();
public static final String getQualifiedBinPath(String executable) throws IOException { // construct hadoop bin path to the specified executable String fullExeName = HADOOP_HOME_DIR + File.separator + "bin" + File.separator + executable; File exeFile = new File(fullExeName); if (!exeFile.exists()) { throw new IOException("Could not locate executable " + fullExeName + " in the Hadoop binaries."); } return exeFile.getCanonicalPath(); } /** a Windows utility to emulate Unix commands */ public static final String WINUTILS = getWinUtilsPath(); public static final String getWinUtilsPath() { String winUtilsPath = null; try { if (WINDOWS) { winUtilsPath = getQualifiedBinPath("winutils.exe"); } } catch (IOException ioe) { LOG.error("Failed to locate the winutils binary in the hadoop binary path", ioe); } return winUtilsPath; }
找到原因后就去網上問了度娘,找到了解決方案,很簡單,如下:
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 即可。
再次運行程序,正常執行。