使用Java API将本地文件上载到远程hdfs,但连接到localhost

时间:2016-12-20 08:42:55

标签: java webhdfs

我有一个非常简单的上传方法,可以将文件上传到单节点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,
  • 检查文件是否已存在(否),
  • 连接到datanode。

这就是失败的地方:发现datanode是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-address => 0.0.0.0:50070

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

1 个答案:

答案 0 :(得分:1)

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

由于它有效,我会将此作为答案发布,因此我不知道我的解决方案的推理是否正确。如果有人知道确切原因,请将其添加为评论或编辑我的答案。