使用 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));
跟踪流程正确启动的情况:
- 连接到 hdfshost:50070,
- 检查文件是否已经存在(否),
- 连接到数据节点。
这就是它失败的地方:发现数据节点是 localhost:50075 而不是 hdfshost:50075,导致 "java.net.ConnectException: Connection refused".
我在hdp上有如下相关设置:
- dfs.client.use.datanode.hostname => 真
- dfs.datanode.http.address => 0.0.0.0:50075
- dfs.namenode.http-地址 => 0.0.0.0:50070
我找不到使用 localhost 而不是 hdfshost 的任何原因(并且 /etc/hosts 中没有覆盖,既不在本地机器上也不在集群上)。任何帮助将不胜感激。
您需要将 http 地址的配置更改为您的本地 IP 地址,而不是 0.0.0.0。
0.0.0.0 被解析为本地主机,然后将被 dfs.client.use.datanode.hostname => true
使用,而您的本地 IP 地址将被解析为 DNS 名称,然后再次被主机名使用。
既然有效,我将post这个作为答案,因此我不知道我对解决方案的推理是否正确。如果有人知道确切原因,请将其添加为评论或编辑我的答案。
我有这个非常简单的上传方法来将文件上传到单节点 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: Connection refused".
我在hdp上有如下相关设置:
- dfs.client.use.datanode.hostname => 真
- dfs.datanode.http.address => 0.0.0.0:50075
- dfs.namenode.http-地址 => 0.0.0.0:50070
我找不到使用 localhost 而不是 hdfshost 的任何原因(并且 /etc/hosts 中没有覆盖,既不在本地机器上也不在集群上)。任何帮助将不胜感激。
您需要将 http 地址的配置更改为您的本地 IP 地址,而不是 0.0.0.0。
0.0.0.0 被解析为本地主机,然后将被 dfs.client.use.datanode.hostname => true
使用,而您的本地 IP 地址将被解析为 DNS 名称,然后再次被主机名使用。
既然有效,我将post这个作为答案,因此我不知道我对解决方案的推理是否正确。如果有人知道确切原因,请将其添加为评论或编辑我的答案。