远程执行 Hadoop 作业时,reduce 阶段出现异常
Posted
技术标签:
【中文标题】远程执行 Hadoop 作业时,reduce 阶段出现异常【英文标题】:Exception during reduce phase when remotely executing Hadoop job 【发布时间】:2013-04-26 20:30:43 【问题描述】:我有一个运行 1.0.4 的小型 10 节点 hadoop 集群,我正在尝试对其进行设置,以便能够从网络上不是 NameNode 的机器提交作业。我有一个简单的示例设置,我使用ToolRunner
执行作业,手动构建JobConf
,并使用JobClient.submitJob()
提交。当我从 NameNode 运行它时,一切都按预期工作。
当我从网络中的任何其他节点运行时,作业已提交并且所有 map 任务都成功完成,但所有 reduce 任务都失败,并出现以下异常:
org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find output/map_0.out in any of the configured local directories
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathToRead(LocalDirAllocator.java:429)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathToRead(LocalDirAllocator.java:160)
at org.apache.hadoop.mapred.MapOutputFile.getInputFile(MapOutputFile.java:161)
at org.apache.hadoop.mapred.ReduceTask.getMapFiles(ReduceTask.java:220)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:398)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
我认为这意味着 reduce 任务无法找到映射器的输出。我相当肯定我只是在某处遗漏了一个配置值,但我不知道是哪一个(我试过mapred.local.dir
和hadoop.tmp.dir
没有成功)。有谁知道上述消息的确切含义以及如何修复它,或者知道从 NameNode 以外的机器执行作业的简单方法?
编辑:我认为这也可能与权限有关。 hadoop
用户几乎拥有 hdfs 上的所有文件,但是当我在另一台机器上登录时,它使用的是不同的用户名。我尝试在集群中类似于this 的所有节点上更新mapred-site.xml
,并将JobClient.submitJob()
包装在UserGroupInformation.doAs()
内,但我仍然收到类似于以下内容的错误:
SEVERE: PriviledgedActionException as:hadoop via oren cause:org.apache.hadoop.ipc.RemoteException: User: oren is not allowed to impersonate hadoop
【问题讨论】:
工作,您是否设法解决了这个问题 - 我也面临同样的问题?你能提供任何输入吗? 【参考方案1】:您是否检查过托管本地目录的磁盘没有空间不足?
【讨论】:
是的,我没有用完任何磁盘上的空间。 mapred.local.dir 和 hadoop.tmp.dir 的路径怎么样。它们是绝对路径还是相对路径? 它们都是绝对路径。 mapred.local.dir 是/home/hadoop/hadoop/tmp/mapred/local
而 hadoop.tmp.dir 是 /home/hadoop/hadoop/tmp
【参考方案2】:
将此属性添加到您的 core-site.xml 并重新启动集群:
<name>hadoop.proxyuser.myhttpfsuser.groups</name>
<value>oren</value>
还要确保您也为“其他人”打开了目录权限。
【讨论】:
【参考方案3】:是的,我想我知道发生了什么……
在尝试从 reduce 作业读取映射输出时,您应该使用 FQDN 风格来构建路径。
类似于hdfs://master:534110/user/hduser/map_0.out
,也许您只是在使用/map_0.out
,但异常没有帮助。
HTH,
【讨论】:
以上是关于远程执行 Hadoop 作业时,reduce 阶段出现异常的主要内容,如果未能解决你的问题,请参考以下文章
在使用 java 运行 Hadoop map reduce 作业时抛出空指针异常