远程执行 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.dirhadoop.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 作业时抛出空指针异常

[Hadoop]MapReducer工作过程

如何确定 Hadoop map和reduce的个数

Hadoop(十七)之MapReduce作业配置与Mapper和Reducer类

MapReduce处理流程

执行查询时,hive 是不是运行 hadoop?