我目前正在为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。
提前谢谢!
罗斯
1条答案
按热度按时间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的片段):
注意,如果
String owner
有空字符串值,它将永远不匹配currentUser
或者realUser
,从运行作业的计算机中提取。在较旧和较新版本的hadoop中,包括Apache0.20.2、1.0.x和2.0.x以及cdh4,此检查被合并到单个语句中,允许空所有者转入默认权限”(来自ApacheHadoop1.0.3-jobsubmissionfiles.java的代码片段):
长话短说,切换到具有折叠比较而不是扩展比较的hadoop版本修复了我的s3问题。