将文件从hdfs复制到windows计算机时出错

ccrfmcuu  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(469)

有一个安装了hadoop并正在运行的linux虚拟机。eclipse中运行的java应用程序可以从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。因为当我在putty中从localhost到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、 这个错误发生在我使用cloudera的quickstart vm时。

bf1o4zei

bf1o4zei1#

datanode将其地址作为127.0.0.1播发到namenode。您需要重新配置伪分布式集群,以便节点在打开套接字服务时使用外部可用的地址(主机名或ip地址)。
我想如果你经营一家 netstat -atn 在您的虚拟机上,您将看到绑定到127.0.0.1而不是0.0.0.0的hadoop端口-这意味着它们只接受内部连接。
您需要查看vm的/etc/hosts配置文件,确保hostname没有解析为127.0.0.1的条目。

lymgl2op

lymgl2op2#

每当你启动一个虚拟机,它都会有自己的IP地址,比如192.x.x.x或172.x.x.x。
使用127.0.0.1 for hdfs在您从windows机器执行时不会有帮助,因为它Map到本地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
一旦获得vms i.p,就在应用程序中使用它。

js5cn81o

js5cn81o3#

你需要改变ip地址。首先进入linux虚拟机,在它的终端中找到虚拟机的ip地址。
在linux虚拟机中查看ip地址的命令如下
ifconfig配置
然后在代码中将ip地址更改为linux虚拟机中显示的ip地址。

相关问题