Hadoop 出现 Failed to set permissions of path 的原因

来源:互联网 发布:帝国时代3mac汉化补丁 编辑:程序博客网 时间:2024/05/18 18:03

  在windows上运行hadoop程序时,会抛异常java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-4954228\.staging to 0700 。抛异常的代码片段如下:

package org.apache.hadoop.fs;public class FileUtil {  /**   * Set permissions to the required value. Uses the java primitives instead   * of forking if group == other.   * @param f the file to change   * @param permission the new permissions   * @throws IOException   */  public static void setPermission(File f, FsPermission permission                                   ) throws IOException {    FsAction user = permission.getUserAction();    FsAction group = permission.getGroupAction();    FsAction other = permission.getOtherAction();    // use the native/fork if the group/other permissions are different    // or if the native is available        if (group != other || NativeIO.isAvailable()) {      execSetPermission(f, permission);      return;    }        boolean rv = true;        // read perms    rv = f.setReadable(group.implies(FsAction.READ), false);    checkReturnValue(rv, f, permission);    if (group.implies(FsAction.READ) != user.implies(FsAction.READ)) {      f.setReadable(user.implies(FsAction.READ), true);      checkReturnValue(rv, f, permission);    }    // write perms    rv = f.setWritable(group.implies(FsAction.WRITE), false);    checkReturnValue(rv, f, permission);    if (group.implies(FsAction.WRITE) != user.implies(FsAction.WRITE)) {      f.setWritable(user.implies(FsAction.WRITE), true);      checkReturnValue(rv, f, permission);    }    // exec perms    rv = f.setExecutable(group.implies(FsAction.EXECUTE), false);    checkReturnValue(rv, f, permission);    if (group.implies(FsAction.EXECUTE) != user.implies(FsAction.EXECUTE)) {      f.setExecutable(user.implies(FsAction.EXECUTE), true);      checkReturnValue(rv, f, permission);    }  }  private static void checkReturnValue(boolean rv, File p,                                        FsPermission permission                                       ) throws IOException {    if (!rv) {      throw new IOException("Failed to set permissions of path: " + p +                             " to " +                             String.format("%04o", permission.toShort()));    }  }}


     异常是job submit过程中调用setPermission函数进行文件权限设置时抛出的。setPermission流程如下:检查要设置的权限中组权限和其他权限是否相同,若不相同则调用本地方法设置;否则调用java.io.File的权限操作函数进行权限设置。


   异常抛出的原因是 setReadable(false,false)返回的结果rv为false。checkReturnValue对rv进行检查抛出的。

     Oracle网站上对java.io.File的权限操作进行了解释,解释如下:


    可以发现,异常抛出的原因是由于设置文件不可读,而windows不支持这样的设置。跟踪代码调用栈可以发现设置文件不可读的代码如下:

package org.apache.hadoop.mapreduce;public class JobSubmissionFiles {  // job submission directory is private!  final public static FsPermission JOB_DIR_PERMISSION =    FsPermission.createImmutable((short) 0700); // rwx--------}

    针对这一问题,网络上比较流行的解决方法为:修改setPermission函数,让其直接返回。


    注:对不存在的文件进行setWrittable设置会返回false

   

原创粉丝点击