从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.

相关文章
相关标签/搜索