从Hadoop URL中读取数据

原创
2015/04/07 14:44
阅读数 190

要从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不需要关闭。

下面是一个运行示例:

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.

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部