1

我目前正在为 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());
}

WheresystemDirStatus.getOwner()返回一个空字符串(s3 文件所有者)并getMROwner().getShortUserName()返回“ mapredHADOOP_USER_NAME ”,尽管通过在 JobTracker 节点上设置环境变量,可以轻松地将这个值更改为空字符串以外的任何值。

这个问题是 S3 不维护“文件所有者”的牺牲品,Hadoop 的 NativeS3Filesystem 和 Jets3t 没有做任何补偿这一事实。

有没有办法在不修补 Hadoop 的情况下解决这个问题?我认为必须有某种方法可以实现这一点,因为 EMR 是 S3 支持的。请注意,我们还不想迁移到 EMR,而是希望继续在我们自己的 EC2 集群上运行 MapReduce,同时将 S3 用于 HDFS。

先感谢您!

拉斯

4

1 回答 1

0

因此,经过进一步研究,我偶然发现了解决问题的方法:

上述问题(其中 S3 不维护文件权限/所有者)在尝试将 S3 支持的 Hadoop JobTrakcers 用作 HDFS 时表现在两个不同的地方:

  1. 在 JobTrakcer 重新启动期间,当 jobtracker.conf 文件已存在时。
  2. 当 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 或空字符串值,它将永远不会匹配currentUseror 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 问题。

于 2013-02-13T02:41:11.357 回答