2

需要从 hdfs 集群外部读取 HDFS。我偶然发现了 WebHdfsFileSystem,即使我明白了这个想法,但我无法让它与网络地址一起工作。例如,只要我使用 127.0.0.1 或 localhost,下面的代码就可以正常工作。但是此刻我使用的网络ip地址是192.168。. ,我收到“重试连接到服务器”消息,然后是 ConnectException。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;



public class ReadHDFSFile {

    public static void main(String[] args) {
        Path p = new Path("hdfs://127.0.0.1:9000/user/hduser");
        WebHdfsFileSystem web = new WebHdfsFileSystem();
        try {
            Configuration conf = new Configuration();
            conf.set("fs.default.name","hdfs://127.0.0.1:9000/");
            web.setConf(conf);
            Configuration conf1 = web.getConf();
            FileSystem fs = FileSystem.get(web.getConf());
            System.out.println(fs.exists(p));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我不确定我在这里错过了什么。

4

1 回答 1

2

我有一个在 Hadoop 2.4 上工作的版本。相对于使用常规 Hadoop FileSystem API,我必须更改两件事:

  • 协议从 更改hdfs://webhdfs://
  • 端口更改为 http 端口(在我们的 Hortonworks 集群上是 50070),而不是默认的 hdfs 端口(也可能称为 RPC 端口?),在我们的系统上是 8020

对我有用的示例代码:

Configuration conf = new Configuration();
String conxUrl = String.format("webhdfs://%s:%s", NAMENODE_IP_ADDR, WEBHDFS_PORT);
conf.set("fs.defaultFS", conxUrl);

FileSystem fs = WebHdfsFileSystem.get(conf);
Path path = new Path("/path/to/my/file");
System.out.println(fs.exists(path));
于 2014-06-23T17:51:37.847 回答