您的位置:首页 > 大数据 > 人工智能

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

2013-05-23 14:53 417 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: