我有一个非常简单的上传方法来将文件上传到单节点 hdp2.5 集群:
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("webhdfs://hdsfhost:50070", conf);
fs.copyFromLocalFile(false, true, new Path(localFilePath), new Path(hdfsPath));
跟踪流程正确启动时发生的情况:
- 连接到 hdfshost:50070,
- 检查文件是否已存在(否),
- 连接到数据节点。
这就是失败的地方:发现数据节点是 localhost:50075 而不是 hdfshost:50075,导致“java.net.ConnectException:连接被拒绝”。
我在 hdp 上有以下相关设置:
- dfs.client.use.datanode.hostname => true
- dfs.datanode.http.address => 0.0.0.0:50075
- dfs.namenode.http-address => 0.0.0.0:50070
我找不到使用 localhost 而不是 hdfshost 的任何原因(并且/etc/hosts 中没有覆盖,本地计算机上和集群上都没有覆盖)。任何帮助将不胜感激。
最佳答案
您需要将 http 地址的配置更改为您的本地 IP 地址,而不是 0.0.0.0。
0.0.0.0 被解析为 localhost,然后将由 dfs.client.use.datanode.hostname => true
使用而您的本地 IP 地址将解析为 DNS 名称,然后再次由主机名使用。
既然它有效,我会将其作为答案发布,因此我不知道我对解决方案的推理是否正确。如果有人知道确切原因,请将其添加为评论或编辑我的答案。
关于java - 使用 Java API 将本地文件上传到远程 hdfs 但连接到 localhost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41237999/