[英]S3 HDFS with No File Owner - AccessControlException
我目前正在为HDFS和MapReduce运行一个小型Hadoop集群,并且我正尝试按照以下页面将S3换成本地HDFS:
我遇到的问题是,启动JobTracker时,如果元数据(jobtracker.info)已经存在,则当Hadoop尝试访问/覆盖此文件时,它无法打开,因为该文件的所有者与MapRed所有者。 在hadoop-core-1.0.3( JobTracker.java )中,比较:
FileStatus systemDirStatus = fs.getFileStatus(systemDir);
if (!systemDirStatus.getOwner().equals( getMROwner().getShortUserName())) {
throw new AccessControlException("The systemdir " + systemDir +
" is not owned by " + getMROwner().getShortUserName());
}
其中, systemDirStatus.getOwner()
返回一个空字符串(s3文件所有者),而getMROwner().getShortUserName()
返回“ mapred ”,尽管通过将HADOOP_USER_NAME
环境变量设置为JobTracker节点。
这个问题是S3不维护“文件所有者”的牺牲品,而Hadoop的NativeS3Filesystem和Jets3t对此无能为力。
有没有解决此问题的方法而无需修补Hadoop? 我认为必须有某种方法来实现这一目标,因为EMR受S3支持。 请注意,我们还不想迁移到EMR,而是想在将S3用于HDFS时继续在我们自己的EC2集群上运行MapReduce。
先感谢您!
拉斯
因此,在进一步研究之后,我偶然发现了解决问题的方法:
S3不维护文件权限/所有者的上述问题,在尝试将由S3支持的Hadoop JobTrakcers用作HDFS时,在两个不同的地方表现出来:
这些问题中的前一个永远不会在Elastic MapReduce中体现,因为“ JobTrackers”仅启动一次,并在作业完成时销毁。 但是,第二个对象可能成为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
或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问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.