[Hadoop Err] Call to ? failed on local exception: java.net.No

如果你 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.hadoopslave2.hadoop,而在 /etc/hosts 中我定义的虚拟域名是 datanode1datanode2

解决方案:

方法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

更多Hadoop相关信息见Hadoop 专题页面 ?tid=13

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1bf093b34c12339b4f4ba455b2139bee.html