繁体   English   中英

没有文件所有者的S3 HDFS-AccessControlException

[英]S3 HDFS with No File Owner - AccessControlException

我目前正在为HDFS和MapReduce运行一个小型Hadoop集群,并且我正尝试按照以下页面将S3换成本地HDFS:

适用于HDFS的AmazonS3

我遇到的问题是,启动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时,在两个不同的地方表现出来:

  1. 在JobTrakcer重新启动期间,当jobtracker.conf文件已经存在时。
  2. 当JobTrakcer尝试从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或空字符串值,则它将永远不会与从运行作业的计算机中提取的currentUserrealUser匹配。

在较早的较新版本的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM