有一个安装了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时。
3条答案
按热度按时间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的条目。
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,就在应用程序中使用它。
js5cn81o3#
你需要改变ip地址。首先进入linux虚拟机,在它的终端中找到虚拟机的ip地址。
在linux虚拟机中查看ip地址的命令如下
ifconfig配置
然后在代码中将ip地址更改为linux虚拟机中显示的ip地址。