從Hadoop URL中讀取數據

要從Hadoop文件系統中讀取文件,一個最簡單的方法是使用java.net.URL對象來打開一個數據流,從而從中讀取數據。通常的格式以下:
1.    InputStream in = null;  
2. try {  
3.     in = new URL("hdfs://host/path").openStream();  
4.     // process in  
5. } finally {  
6.     IOUtils.closeStream(in);  
7. } 
這裏還須要一點工做來讓Java識別Hadoop文件系統的URL 方案,就是經過一個FsUrlStreamHandlerFactory實例來調用在URL中的setURLStreamHandler-Factory方法。這種方法在一個Java虛擬機中只能被調用一次,所以通常都在一個靜態塊中執行。這個限制意味着若是程序的其餘部件(多是不在你控制中的第三方部件)設置一個URLStreamHandlerFactory,咱們便沒法再從Hadoop中讀取數據。下一節將討論另外一種方法。
例3-1展現了以標準輸出顯示Hadoop文件系統的文件的程序,它相似於Unix的cat命令。
例3-1:用URLStreamHandler以標準輸出格式顯示Hadoop文件系統的文件
1. public class URLCat {  
2.  
3.  static {  
4.    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());  
5.  }  
6.    
7.  public static void main(String[] args) throws Exception {  
8.    InputStream in = null;  
9.    try {  
10.      in = new URL(args[0]).openStream();  
11.      IOUtils.copyBytes(in, System.out, 4096, false);  
12.    } finally {  
13.      IOUtils.closeStream(in);  
14.    }  
15.  }  
16. } 
咱們使用Hadoop中簡潔的IOUtils類在finally子句中關閉數據流,同時複製輸入流和輸出流之間的字節(本例中是System.out)。copyBytes方法的最後兩個參數,前者是要複製的緩衝的大小,後者表示複製結束後是否關閉數據流。這裏是將輸入流關掉了,而System.out不須要關閉。java

瞭解更多詳情請登陸超人學院網站http://www.crxy.cn?sxy或者關注超人學院微信號:CRXY-CN微信

相關文章
相關標籤/搜索