我有一个运行1.0.4的小型10节点hadoop集群,我正在设置它,所以我能够从网络上不是NameNode的机器上提交作业。我有一个简单的示例设置,我使用ToolRunner
执行作业,手动构建JobConf
,并使用JobClient.submitJob()
提交。当我从NameNode运行它时,一切都按预期工作。
当我从网络中的任何其他节点运行时,提交作业并成功完成所有映射任务,但所有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上的所有文件,但是当我在另一台计算机上登录时,它就是一个不同的用户名。我尝试在群集中的所有节点上更新mapred-site.xml
,类似于this,并将JobClient.submitJob()
包裹在UserGroupInformation.doAs()
内,但我仍然遇到类似于以下内容的错误:< / p>
SEVERE: PriviledgedActionException as:hadoop via oren cause:org.apache.hadoop.ipc.RemoteException: User: oren is not allowed to impersonate hadoop
答案 0 :(得分:0)
您是否检查过托管本地目录的磁盘空间不足?
答案 1 :(得分:0)
将此属性添加到core-site.xml并重新启动群集:
<name>hadoop.proxyuser.myhttpfsuser.groups</name>
<value>oren</value>
另外请确保您已经为“其他人”打开了dir权限。
答案 2 :(得分:0)
是的,我想我知道发生了什么......
在尝试从reduce作业中读取地图输出时,应使用FQDN-ish样式来构建路径。
类似于hdfs://master:534110/user/hduser/map_0.out
,也许你只是使用/map_0.out
而且例外没有帮助。
HTH,