因此,经过进一步研究,我偶然发现了解决问题的方法:
上述问题(其中 S3 不维护文件权限/所有者)在尝试将 S3 支持的 Hadoop JobTrakcers 用作 HDFS 时表现在两个不同的地方:
- 在 JobTrakcer 重新启动期间,当 jobtracker.conf 文件已存在时。
- 当 JobTrakcer 尝试从 HDFS 中的暂存目录获取信息时转换到作业的第二个任务。
这些问题中的前者从未在 Elastic MapReduce 中出现,因为“JobTracker”只启动一次,并在作业完成后被销毁。然而,第二个可能会成为org.apache.hadoop.mapreduce.JobSubmissionFiles
类检查的受害者,具体取决于您使用的 Hadoop 版本。
在大多数 CDH3 发行版中(我只检查了 cdh3u3、cdh3u4 和 cdh3u5),文件所有者和权限在两个单独的语句中检查以添加更详细的日志记录(来自 cdh3u5 - JobSubmissionFiles.java的片段):
FileStatus fsStatus = fs.getFileStatus(stagingArea);
String owner = fsStatus.getOwner();
if (!(owner.equals(currentUser) || owner.equals(realUser))) {
throw new IOException("The ownership on the staging directory " +
stagingArea + " is not as expected. " +
"It is owned by " + owner + ". The directory must " +
"be owned by the submitter " + currentUser + " or " +
"by " + realUser);
}
if (!fsStatus.getPermission().equals(JOB_DIR_PERMISSION)) {
LOG.info("Permissions on staging directory " + stagingArea + " are " +
"incorrect: " + fsStatus.getPermission() + ". Fixing permissions " +
"to correct value " + JOB_DIR_PERMISSION);
fs.setPermission(stagingArea, JOB_DIR_PERMISSION);
}
请注意,如果String owner
有一个 null 或空字符串值,它将永远不会匹配currentUser
or realUser
,它们是从运行作业的机器中提取的。
在较旧和较新的 hadoop 版本中,包括 Apache 0.20.2、1.0.x 和 2.0.x 以及 CDH4,此检查被合并到一个语句中,允许空所有者转入默认权限" (来自 Apache Hadoop 1.0.3 - JobSubmissionFiles.java的片段):
FileStatus fsStatus = fs.getFileStatus(stagingArea);
String owner = fsStatus.getOwner();
if (!(owner.equals(currentUser) || owner.equals(realUser)) ||
!fsStatus.getPermission().equals(JOB_DIR_PERMISSION)) {
throw new IOException("The ownership/permissions on the staging " +
"directory " + stagingArea + " is not as expected. " +
"It is owned by " + owner + " and permissions are "+
fsStatus.getPermission() + ". The directory must " +
"be owned by the submitter " + currentUser + " or " +
"by " + realUser + " and permissions must be rwx------");
}
长话短说,切换到具有折叠比较而不是扩展比较的 Hadoop 版本解决了我的 S3 问题。