2013-10-18 51 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));