從Hadoop URL中讀取數據

要從Hadoop文件系統中讀取文件,一個最簡單的方法是使用java.net.URL對象來打開一個數據流,從而從中讀取數據。通常的格式以下:java

1.      InputStream in = null;  oop

2.  try {  spa

3.       in = new URL("hdfs://host/path").openStream();.net

4.       // process inorm

5.  } finally {  對象

6.       IOUtils.closeStream(in);hadoop

7.  }get

這裏還須要一點工做來讓Java識別Hadoop文件系統的URL 方案,就是經過一個FsUrlStreamHandlerFactory實例來調用在URL中的setURLStreamHandler-Factory方法。這種方法在一個Java虛擬機中只能被調用一次,所以通常都在一個靜態塊中執行。這個限制意味着若是程序的其餘部件(多是不在你控制中的第三方部件)設置一個URLStreamHandlerFactory,咱們便沒法再從Hadoop中讀取數據。下一節將討論另外一種方法。虛擬機

例3-1展現了以標準輸出顯示Hadoop文件系統的文件的程序,它相似於Unix的cat命令。io

例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不須要關閉。

下面是一個運行示例:

1.      % hadoop URLCat hdfs://localhost/user/tom/quangle.txt

2.  On the top of the Crumpetty Tree

3.  The Quangle Wangle sat,  

4.  But his face you could not see,

5.  On account of his Beaver Hat.

相關文章
相關標籤/搜索