如果你 grep datanode 的 log 发现了这个 Error,原文如下:
Hadoop-hadoop-tasktracker-slave1.hadoop.log.2011-01-25:2011-01-25 23:00:53,810 ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.io.IOException: Call to namenode/192.168.17.128:9001 failed on local exception: java.net.NoRouteToHostException: No route to host
那么基本上你的 reduce 不太可能会成功,在 name node 的 console 里每当执行到 reduce 的时候会报出这种错误:
Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
原因:
这可能是由于你的 hostname 域名和 /etc/hosts中配置的虚拟域名不一致引起的。因为 hadoop 使用配置文件中定义的”master“和"slave"域名,并在/etc/hosts中找到相关的ip地址来进行引用的。而 Map-Reduce 或任何 Hadoop class 又可能使用机器名 hostname 来进行引用。我这边的情况是我的 master 的 hostname 是 master.hadoop 而在 /etc/hosts 中我定义的虚拟域名是 namenode,而我的 slave 的 hostname 是 slave1.hadoop 和 slave2.hadoop,而在 /etc/hosts 中我定义的虚拟域名是 datanode1 和 datanode2 。
解决方案:
方法1:修改hostname 和 /etc/hosts 里的虚拟域名一致,在我的case里,我需要把master机器的hostname改成‘namenode’,把slave机器的hostname分别改成‘datanode1’和‘datanode2’
方法2:如果由于种种原因你没法修改域名(域名已经在其他地方被使用,比如这台机器同时是一台文件服务器或者因特网服务器),你可以修改 /etc/hosts 来为每个记录增加一个和其域名一致的域名别名(domain name alias) 。根据我的case,我应该把 /etc/hosts 文件改成这样:
xxx.xxx.xxx.xxx namenode master.hadoop
xxx.xxx.xxx.xxx datanode1 slave1.hadoop
xxx.xxx.xxx.xxx datanode2 slave2.hadoop