将文件从HDFS复制到Windows计算机时出错

时间:2013-11-20 15:18:37

标签: java hadoop hdfs cloudera

有一个安装并运行Hadoop的Linux VM。 Eclipse中运行的Java应用程序可以从HDFS中检索数据。 如果我在VM内部将文件复制到HDFS或从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 localhost。 因为当我从puthost到VM创建一个隧道时,一切都很好。

这是我的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时会发生此错误。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

无论何时启动VM,它都会获得自己的I.P.像192.x.x.x或172.x.x.x。

使用127.0.0.1 for HDFS在从Windows框执行时无用,因为它映射到本地i.p.因此,如果您从Windows机器使用127.0.0.1,它会认为您的HDFS正在Windows机器上运行。这就是你的连接失败的原因。

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

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

答案 2 :(得分:0)

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

查看linux VM中ip地址的命令

  

ifconfig

然后在您的代码中将IP地址更改为您的Linux VM中显示的IP。