2013-11-20 70 views
1

安装并运行了Hadoop的Linux VM。 在Eclipse中运行的Java应用程序从HDFS中检索数据。 如果我将文件复制到VM中的HDFS或从VM中复制文件,一切正常。 但是,当我从我的Windows物理机上运行应用程序,我得到一个异常:将文件从HDFS复制到Windows机器时出错

WARN hdfs.DFSClient: Failed to connect to /127.0.0.1:50010 for block, add to 
deadNodes and continue. java.net.ConnectException: Connection refused: no further 
information. Could not obtain BP-*** from any node: java.io.IOException: 
No live nodes contain current block. Will get new block locations from namenode and retry 

我只能从HDFS中检索文件的列表。 似乎从数据节点检索数据时,它将连接到我的Windows本地主机。 因为当我从我的本地主机到虚拟主机的腻子隧道一切都很好。

这里是我的Java代码:

Configuration config = new Configuration(); 
config.set("fs.defaultFS", "hdfs://ip:port/"); 
config.set("mapred.job.tracker", "hdfs://ip:port"); 
FileSystem dfs = FileSystem.get(new URI("hdfs://ip:port/"), config, "user"); 
dfs.copyToLocalFile(false, new Path("/tmp/sample.txt"),newPath("D://sample.txt"), true); 

怎样才可以解决吗? 谢谢。

P.S.当我使用Cloudera的QuickStart VM时会发生此错误。

回答

0

您需要更改ip。首先转到linux VM并在其终端中找到您的VM的IP地址。

命令看到Linux的虚拟机的IP地址低于

使用ifconfig

然后在你的代码更改IP地址的IP在你的Linux VM显示,多数民众赞成。

1

您的DataNode将其地址作为127.0.0.1通告给NameNode。您需要重新配置您的伪分布式群集,以便在打开套接字服务时节点使用外部可用的地址(主机名或IP地址)。

我想如果你在虚拟机上运行netstat -atn,你会发现Hadoop端口绑定到127.0.0.1而不是0.0.0.0,这意味着它们只接受内部连接。

您需要查看虚拟机的/ etc/hosts配置文件,并确保主机名没有解析为127.0.0.1的条目。

1

每当您启动一个虚拟机时,它都会拥有自己的I.P.类似于192.x.x.x或172.x.x.x.

对于HDFS,使用127.0.0.1在您从Windows窗口执行时无法提供帮助,因为它映射到本地i.p.所以,如果你使用windows机器上的127.0.0.1,它会认为你的HDFS正在windows机器上运行。这就是你的连接失败的原因。

查找与您的虚拟机关联的i.p。如果您使用的是Hyper-V,这里有一个链接。 http://windowsitpro.com/hyper-v/quickly-view-all-ip-addresses-hyper-v-vms

获得虚拟机I.P后,在应用程序中使用它。

相关问题