Could not locate executable null 解决办法【在windows环境下开发hadoop2.4.1或者hadoop2.5.2的mapreduce,执行job遇到的一些错误】

本文详细解答了在Windows环境下使用Hadoop 2.2.0版本进行MapReduce开发时遇到的问题,包括配置环境变量、下载缺失的依赖文件、解决权限问题以及配置64位JDK以避免编译错误等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章来自:

http://blog.youkuaiyun.com/lanwenbing/article/details/40783335

以下是具体的解决办法,本人遇到问题的时候,通过下面的方法已经解决!

可以在windows8、windows7 64位操作系统4G内存 i5 进行hadoop2.4.1和hadoop2.5.2的mapreduce开发


【若本文有错误,请查看 上面的详情链接】


文章来自http://www.aboutyun.com/thread-8030-1-1.html

问题导读:

1.建一个MapReduce Project,运行时发现出问题:Could not locate executable null,该如何解决?
2.Could not locate executabl   ....\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe in the Hadoop binaries.该如何解决?







1. 创建一个MapReduce Project,运行时发现出问题了。


java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.




跟代码就去发现是HADOOP_HOME的问题。如果HADOOP_HOME为空,必然fullExeName为null\bin\winutils.exe。解决方法很简单啦,乖乖的配置环境变量吧,不想重启电脑可以在MapReduce程序里加上System.setProperty("hadoop.home.dir", "...");暂时缓缓。org.apache.hadoop.util.Shell.java
  1.   public static final String getQualifiedBinPath(String executable) 
  2.   throws IOException {
  3.     // construct hadoop bin path to the specified executable
  4.     String fullExeName = HADOOP_HOME_DIR + File.separator + "bin" 
  5.       + File.separator + executable;

  6.     File exeFile = new File(fullExeName);
  7.     if (!exeFile.exists()) {
  8.       throw new IOException("Could not locate executable " + fullExeName
  9.         + " in the Hadoop binaries.");
  10.     }

  11.     return exeFile.getCanonicalPath();
  12.   }

  13. private static String HADOOP_HOME_DIR = checkHadoopHome();
  14. private static String checkHadoopHome() {

  15.     // first check the Dflag hadoop.home.dir with JVM scope
  16.     String home = System.getProperty("hadoop.home.dir");

  17.     // fall back to the system/user-global env variable
  18.     if (home == null) {
  19.       home = System.getenv("HADOOP_HOME");
  20.     }
  21.      ...
  22. }
复制代码



2. 这个时候得到完整的地址fullExeName,我机器上是D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe。继续执行代码又发现了错误
Could not locate executable D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe in the Hadoop binaries.

就去一看,没有winutils.exe这个东西。去https://github.com/srccodes/hadoop-common-2.2.0-bin下载一个,放就去即可。
3. 继续出问题
  1. at org.apache.hadoop.util.Shell.execCommand(Shell.java:661)at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:639)at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:435)
复制代码

  继续跟代码org.apache.hadoop.util.Shell.java
  1. <span style="line-height: 1.5;"> </span> public static String[] getSetPermissionCommand(String perm, boolean recursive,
  2.                                                  String file) {
  3.     String[] baseCmd = getSetPermissionCommand(perm, recursive);
  4.     String[] cmdWithFile = Arrays.copyOf(baseCmd, baseCmd.length + 1);
  5.     cmdWithFile[cmdWithFile.length - 1] = file;
  6.     return cmdWithFile;
  7.   }

  8.   /** Return a command to set permission */
  9.   public static String[] getSetPermissionCommand(String perm, boolean recursive) {
  10.     if (recursive) {
  11.       return (WINDOWS) ? new String[] { WINUTILS, "chmod", "-R", perm }
  12.                          : new String[] { "chmod", "-R", perm };
  13.     } else {
  14.       return (WINDOWS) ? new String[] { WINUTILS, "chmod", perm }
  15.                        : new String[] { "chmod", perm };
  16.     }
  17.   }
复制代码

cmdWithFile数组的内容为{"D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe", "chmod", "755", "xxxfile"},我把这个单独在cmd里执行了一下,发现
无法启动此程序,因为计算机中丢失 MSVCR100.dll

那就下载一个呗http://files.cnblogs.com/sirkevin/msvcr100.rar,丢到C:\Windows\System32里面。再次cmd执行,又来了问题
应用程序无法正常启动(0xc000007b)

下载 http://blog.youkuaiyun.com/vbcom/article/details/7245186  DirectX_Repair来解决这个问题吧。记得修复完后要重启电脑。搞定后cmd试一下,很棒。
4. 到了这里,已经看到曙光了,但问题又来了
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

代码就去
  1.     /** Windows only method used to check if the current process has requested*  access rights on the given path. */
  2.       private static native boolean access0(String path, int requestedAccess);
复制代码


显然缺少dll文件,还记得 https://github.com/srccodes/hadoop-common-2.2.0-bin 下载的东西吧,里面就有hadoop.dll,最好的方法就是用hadoop-common-2.2.0-bin-master/bin目录替换本地hadoop的bin目录,并在环境变量里配置PATH=HADOOP_HOME/bin,重启电脑。
1.下载地址

 
hadoop家族、strom、spark、Linux、flume等jar包、安装包汇总下载(持续更新)


注意的问题:
环境变量一定配置正确,否则还是不能运行
PATH=HADOOP_HOME/bin,如果这个不行,可以换成绝对路径

5. 终于看到了MapReduce的正确输出output99。




总结  
  • hadoop eclipse插件不是必须的,其作用在我看来就是如下三点(这个是一个错误的认识,具体请参考http://zy19982004.iteye.com/blog/2031172)。study-hadoop是一个普通project,直接运行(不通过Run on Hadoop这只大象),一样可以调试到MapReduce。




      • 对hadoop中的文件可视化。
      • 创建MapReduce Project时帮你引入依赖的jar。
      • Configuration conf = new Configuration();时就已经包含了所有的配置信息。
  • 还是自己下载hadoop2.2的源码编译好,应该是不会有任何问题的(没有亲测)。

六.   其它问题
  • 还是
    1. Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    复制代码


    代码跟到org.apache.hadoop.util.NativeCodeLoader.java去看
    1.   static {
    2.     // Try to load native hadoop library and set fallback flag appropriately
    3.     if(LOG.isDebugEnabled()) {
    4.       LOG.debug("Trying to load the custom-built native-hadoop library...");
    5.     }
    6.     try {
    7.       System.loadLibrary("hadoop");
    8.       LOG.debug("Loaded the native-hadoop library");
    9.       nativeCodeLoaded = true;
    10.     } catch (Throwable t) {
    11.       // Ignore failure to load
    12.       if(LOG.isDebugEnabled()) {
    13.         LOG.debug("Failed to load native-hadoop with error: " + t);
    14.         LOG.debug("java.library.path=" +
    15.             System.getProperty("java.library.path"));
    16.       }
    17.     }
    18.     
    19.     if (!nativeCodeLoaded) {
    20.       LOG.warn("Unable to load native-hadoop library for your platform... " +
    21.                "using builtin-java classes where applicable");
    22.     }
    23.   }
    复制代码

    这里报错如下
    1. DEBUG org.apache.hadoop.util.NativeCodeLoader - Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: HADOOP_HOME\bin\hadoop.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
    复制代码


    怀疑是32位jdk的问题,替换成64位后,没问题了
    1. 2014-03-11 19:43:08,805 DEBUG org.apache.hadoop.util.NativeCodeLoader - Trying to load the custom-built native-hadoop library...
    2. 2014-03-11 19:43:08,812 DEBUG org.apache.hadoop.util.NativeCodeLoader - Loaded the native-hadoop library
    复制代码

    这里也解决了一个常见的警告
    1. WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    复制代码

<think>好的,我现在需要解决用户在Spark运行时遇到的错误:“Could not locate executable null\bin\winutils.exe in the Hadoop binaries”。首先,我要理解这个问题出现的原因。根据用户提供的引用信息,特别是引用[2]和[3],这个错误是因为在Windows环境下运行Spark时,缺少Hadoop的winutils.exe文件。Spark依赖于Hadoop的一些库,即使在本地模式下运行,也可能需要这些二进制文件来处理文件系统操作。 接下来,我需要确定解决步骤。根据引用[2],解决方案包括下载winutils.exe并设置环境变量HADOOP_HOME。用户需要下载对应Hadoop版本的winutils,比如Hadoop 3.0.0。然后,将HADOOP_HOME指向解压后的目录,并将%HADOOP_HOME%\bin添加到PATH中。此外,引用[3]提到需要重启IDE或系统,确保环境变量生效。同时,确保路径没有空格或特殊字符,避免其他问题,如引用[4]中的路径错误。 另外,用户可能还需要处理文件权限问题,如使用管理员权限运行命令提示符,执行`winutils.exe chmod`命令,避免权限相关的异常。同时,检查项目中的文件路径是否正确,比如引用[4]中的输入路径不存在的问题,这也是常见的错误来源。 最后,生成相关问题需要考虑用户可能的后续疑问,比如其他环境问题、不同Hadoop版本的兼容性,或者在非Windows系统下的情况。确保问题覆盖常见的使用场景和潜在的错误点,帮助用户全面理解和解决类似问题。</think>### 解决Spark因缺少winutils.exe导致的错误 #### 问题原因 在Windows系统中运行Spark程序时,Hadoop的本地依赖文件`winutils.exe`缺失或未正确配置环境变量,导致系统无法定位该文件。Spark在处理文件操作(如临时目录创建、权限管理)时会调用Hadoop相关工具[^3]。 --- #### 解决方案步骤 1. **下载对应版本的winutils.exe** - 访问[Hadoop Windows工具库](https://github.com/cdarlint/winutils),选择与Spark兼容的Hadoop版本(例如Spark 3.x通常对应Hadoop 3.3.x)[^2]。 - 下载后解压到本地目录(如`D:\hadoop\bin`),确保`winutils.exe`位于`bin`文件夹内。 2. **配置环境变量** - 添加系统变量`HADOOP_HOME`,值为Hadoop工具的解压目录(例如`D:\hadoop`)。 - 将`%HADOOP_HOME%\bin`添加到`Path`变量中。 - 重启IDE(如IntelliJ IDEA)或系统使配置生效。 3. **修复文件权限问题** ```powershell # 以管理员身份运行命令提示符 winutils.exe chmod 777 C:\tmp\hive ``` 此命令解决因权限不足导致的临时目录访问异常。 4. **验证路径配置** - 检查输入/输出路径是否存在(如引用[4]中的`file:/D:/workspace/spark/src/main/Data/data1.txt`需确保路径正确)。 - 避免路径包含空格或特殊字符(如`Program Files`可能引发问题)[^4]。 --- #### 代码示例:Spark初始化时显式设置Hadoop路径 ```scala // 在SparkSession构建器中添加配置 val spark = SparkSession.builder() .appName("Example") .config("spark.sql.warehouse.dir", "C:/tmp/spark-warehouse") .config("spark.hadoop.hadoop.home.dir", "D:\\hadoop") // 显式指定Hadoop路径 .getOrCreate() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值