s3hdfs-accesscontrolexception

2vuwiymt  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(416)

我目前正在为hdfs和mapreduce运行一个小型hadoop集群,我正在尝试用s3替换本地hdfs,如下所示:
用于hdfs的amazons3
我遇到的问题是,在启动jobtracker时,如果元数据(jobtracker.info)已经存在,当hadoop尝试访问/覆盖此文件时,它无法打开它,因为该文件的所有者与Map的所有者不匹配。在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,希望继续在自己的ec2集群上运行mapreduce,同时将s3用于hdfs。
提前谢谢!
罗斯

yjghlzjz

yjghlzjz1#

因此,经过进一步研究,我偶然发现了解决我问题的方法:
上面描述的问题,其中s3不维护文件权限/所有者,在尝试将s3支持的hadoop jobtrakcers用作hdf时,出现在两个不同的地方:
在jobtrakcer重新启动期间,当jobtracker.conf文件已经存在时。
当jobtrakcer试图从hdfs中的暂存目录获取信息时,转换到作业的第二个任务。
这些问题中的前一个从来没有在弹性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 有空字符串值,它将永远不匹配 currentUser 或者 realUser ,从运行作业的计算机中提取。
在较旧和较新版本的hadoop中,包括Apache0.20.2、1.0.x和2.0.x以及cdh4,此检查被合并到单个语句中,允许空所有者转入默认权限”(来自ApacheHadoop1.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问题。

相关问题