使用 Java API 将本地文件上传到远程 hdfs 但连接到本地主机

Uploading a local file to a remote hdfs with Java API but connect to localhost

我有这个非常简单的上传方法来将文件上传到单节点 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));

跟踪流程正确启动的情况:

这就是它失败的地方:发现数据节点是 localhost:50075 而不是 hdfshost:50075,导致 "java.net.ConnectException: Connection refused".

我在hdp上有如下相关设置:

我找不到使用 localhost 而不是 hdfshost 的任何原因(并且 /etc/hosts 中没有覆盖,既不在本地机器上也不在集群上)。任何帮助将不胜感激。

您需要将 http 地址的配置更改为您的本地 IP 地址,而不是 0.0.0.0。 0.0.0.0 被解析为本地主机,然后将被 dfs.client.use.datanode.hostname => true 使用,而您的本地 IP 地址将被解析为 DNS 名称,然后再次被主机名使用。

既然有效,我将post这个作为答案,因此我不知道我对解决方案的推理是否正确。如果有人知道确切原因,请将其添加为评论或编辑我的答案。