《Hadoop权威指南:大数据的存储与分析》—3.5 Java接口

举报
清华大学出版社 发表于 2019/10/12 13:54:24 2019/10/12
【摘要】 本节书摘来自清华大学出版社《Hadoop权威指南:大数据的存储与分析》一书中第三章,第3.5.1节,作者是Tom White , 王 海 华 东 刘 喻 吕粤海 译。

3.5  Java接口

在本小节中,我们要深入探索HadoopFilesystem类:它是与Hadoop的某一文件系统进行交互的API虽然我们主要聚焦于HDFS实例,即DistributedFileSystem,但总体来说,还是应该集成FileSystem抽象类,并编写代码,使其在不同文件系统中可移植。这对测试你编写的程序非常重要,例如,你可以使用本地文件系统中的存储数据快速进行测试。

3.5.1  Hadoop URL读取数据

要从Hadoop 文件系统读取文件,最简单的方法是使用java.net.URL对象打开数据流,从中读取数据。具体格式如下:

InputStream in = null; 

 try { 

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

      // process in 

 } finally { 

      IOUtils.closeStream(in); 

 }

 

Java程序能够识别Hadoophdfs URL方案还需要一些额外的工作。这里采用的方法是通过FsUrlStreamHandlerFactory实例调用java.net.URL对象的setURLStreamHandlerFactory()方法。每个Java虚拟机只能调用一次这个方法,因此通常在静态方法中调用。这个限制意味着如果程序的其他组件(如不受你控制的第三方组件)已经声明一个URLStreamHandlerFactory实例,你将无法使用这种方法从Hadoop中读取数据。下一节将讨论另一种备选方法。

范例3-1展示的程序以标准输出方式显示Hadoop文件系统中的文件,类似于Unix中的cat命令。

范例3-1. 通过URLStreamHandler实例以标准输出方式显示Hadoop文件系统的文件

 public class URLCat { 

 

   static { 

     URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 

   } 

 

   public static void main(String[] args) throws Exception {  

     InputStream in = null; 

     try { 

       in = new URL(args[0]).openStream(); 

       IOUtils.copyBytes(in, System.out, 4096, false); 

     } finally { 

       IOUtils.closeStream(in); 

     } 

   } 

 }

 

我们可以调用Hadoop中简洁的IOUtils类,并在finally子句中关闭数据流,同时也可以在输入流和输出流之间复制数据(本例中为System.out)copyBytes方法的最后两个参数,第一个设置用于复制的缓冲区大小,第二个设置复制结束后是否关闭数据流。这里我们选择自行关闭输入流,因而System.out不必关闭输入流。

下面是一个运行示例:

% export HADOOP_CLASSPATH=hadoop-examples.jar

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

 On the top of the Crumpetty Tree 

 The Quangle Wangle sat, 

 But his face you could not see, 

 On account of his Beaver Hat.





【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。