13544870125 发表于 2018-10-30 11:20:41

从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>  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).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>  5.On account of his Beaver Hat.

页: [1]
查看完整版本: 从Hadoop URL中读取数据