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

来源:互联网 发布:淘宝大学免费课程ps 编辑:程序博客网 时间:2024/05/20 01:12

文章来源:http://blog.csdn.net/vickyrocker1/article/details/47341183


之前在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。

<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">private</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span></span><span style="color: rgb(0, 0, 0);"> String checkHadoopHome() {  </span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> first check the Dflag hadoop.home.dir with JVM scope</span></span><span style="color: rgb(0, 128, 0);"></span>  String home = System.getProperty(<span class="string" style="color: rgb(221, 17, 68);">"hadoop.home.dir"</span><span style="color: rgb(0, 0, 0);">);  </span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> fall back to the system/user-global env variable</span></span><span style="color: rgb(0, 128, 0);"></span>  <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span> (home == <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">null</span></span><span style="color: rgb(0, 0, 0);">) {    home </span>= System.getenv(<span class="string" style="color: rgb(221, 17, 68);">"HADOOP_HOME"</span><span style="color: rgb(0, 0, 0);">);  }  </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">try</span></span><span style="color: rgb(0, 0, 0);"> {     </span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> couldn't find either setting for hadoop's home directory</span></span><span style="color: rgb(0, 128, 0);"></span>     <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span> (home == <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">null</span></span><span style="color: rgb(0, 0, 0);">) {       </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">throw</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span> IOException(<span class="string" style="color: rgb(221, 17, 68);">"HADOOP_HOME or hadoop.home.dir are not set."</span><span style="color: rgb(0, 0, 0);">);     }     </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span> (home.startsWith(<span class="string" style="color: rgb(221, 17, 68);">"\""</span>) && home.endsWith(<span class="string" style="color: rgb(221, 17, 68);">"\""</span><span style="color: rgb(0, 0, 0);">)) {       home </span>= home.substring(<span class="number" style="color: rgb(0, 153, 153);">1</span>, home.length()-<span class="number" style="color: rgb(0, 153, 153);">1</span><span style="color: rgb(0, 0, 0);">);     }     </span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> check that the home setting is actually a directory that exists</span></span><span style="color: rgb(0, 128, 0);"></span>     File homedir = <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span><span style="color: rgb(0, 0, 0);"> File(home);     </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span> (!homedir.isAbsolute() || !homedir.exists() || !<span style="color: rgb(0, 0, 0);">homedir.isDirectory()) {       </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">throw</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span> IOException(<span class="string" style="color: rgb(221, 17, 68);">"Hadoop home directory "</span> +<span style="color: rgb(0, 0, 0);"> homedir         </span>+ <span class="string" style="color: rgb(221, 17, 68);">" does not exist, is not a directory, or is not an absolute path."</span><span style="color: rgb(0, 0, 0);">);     }     home </span>=<span style="color: rgb(0, 0, 0);"> homedir.getCanonicalPath();  } </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">catch</span></span><span style="color: rgb(0, 0, 0);"> (IOException ioe) {    </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span><span style="color: rgb(0, 0, 0);"> (LOG.isDebugEnabled()) {      LOG.debug(</span><span class="string" style="color: rgb(221, 17, 68);">"Failed to detect a valid hadoop home directory"</span><span style="color: rgb(0, 0, 0);">, ioe);    }    home </span>= <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">null</span></span><span style="color: rgb(0, 0, 0);">;  }      </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">return</span></span><span style="color: rgb(0, 0, 0);"> home;}</span>

private static String HADOOP_HOME_DIR = checkHadoopHome ();

<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">public</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">final</span></span><span style="color: rgb(0, 0, 0);"> String getQualifiedBinPath(String executable) </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">throws</span></span><span style="color: rgb(0, 0, 0);"> IOException {  </span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> construct hadoop bin path to the specified executable</span></span><span style="color: rgb(0, 128, 0);"></span>  String fullExeName = HADOOP_HOME_DIR + File.separator + <span class="string" style="color: rgb(221, 17, 68);">"bin"</span>     + File.separator +<span style="color: rgb(0, 0, 0);"> executable;  File exeFile </span>= <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span><span style="color: rgb(0, 0, 0);"> File(fullExeName);  </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span> (!<span style="color: rgb(0, 0, 0);">exeFile.exists()) {    </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">throw</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span> IOException(<span class="string" style="color: rgb(221, 17, 68);">"Could not locate executable "</span> +<span style="color: rgb(0, 0, 0);"> fullExeName      </span>+ <span class="string" style="color: rgb(221, 17, 68);">" in the Hadoop binaries."</span><span style="color: rgb(0, 0, 0);">);  }  </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">return</span></span><span style="color: rgb(0, 0, 0);"> exeFile.getCanonicalPath();}</span><span style="color: rgb(0, 128, 0);"><span class="javadoc" style="color: rgb(153, 153, 136); font-style: italic;">/**</span></span><span class="javadoc" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> a Windows utility to emulate Unix commands </span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">public</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">final</span></span> String WINUTILS =<span style="color: rgb(0, 0, 0);"> getWinUtilsPath();</span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">public</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span></span> <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">final</span></span><span style="color: rgb(0, 0, 0);"> String getWinUtilsPath() {  String winUtilsPath </span>= <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">null</span></span><span style="color: rgb(0, 0, 0);">;  </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">try</span></span><span style="color: rgb(0, 0, 0);"> {    </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span><span style="color: rgb(0, 0, 0);"> (WINDOWS) {      winUtilsPath </span>= getQualifiedBinPath(<span class="string" style="color: rgb(221, 17, 68);">"winutils.exe"</span><span style="color: rgb(0, 0, 0);">);    }  } </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">catch</span></span><span style="color: rgb(0, 0, 0);"> (IOException ioe) {     LOG.error(</span><span class="string" style="color: rgb(221, 17, 68);">"Failed to locate the winutils binary in the hadoop binary path"</span><span style="color: rgb(0, 0, 0);">,       ioe);  }  </span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">return</span></span><span style="color: rgb(0, 0, 0);"> winUtilsPath;}</span>

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

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 即可。

再次运行程序,正常执行。






0 0