2013-10-18 54 views
2

需要从hdfs集群外部读取HDFS。我偶然发现了WebHdfsFileSystem,尽管我明白了这一点,但我无法使其与网络地址一起工作。例如,只要我使用127.0.0.1或localhost,下面的代码就可以正常工作。但是现在我使用网络IP地址192.168。 ,我得到“重试连接到服务器”消息,然后是ConnectException。WebHdfsFileSystem本地ip vs网络ip hadoop

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(); 
     } 
    } 
} 

我不知道我在这里错过了什么。

回答

2

我有一个在Hadoop 2.4上工作的版本。我不得不改变相对两件事情来使用常规的Hadoop文件系统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));