- 摘要:《Hadoop权威指南(中文版)》第3章Hadoop分布式文件系统,本章着眼于 Hadoop的文件系统,特别深入地讲解HDFS。本节为大家介绍从Hadoop URL中读取数据。
- 标签:Hadoop Hadoop权威指南(中文版)
3.5 Java接口
在本小节,我们要深入探索Hadoop的Filesystem类:与Hadoop的文件系统交互的API。 虽然我们主要关注的是HDFS的实现DistributedFileSystem,但总体来说,还是应该努力编写不同于FileSsytem抽象类的代 码,以保持其在不同文件系统中的可移植性。这是考验编程能力的最佳手段,因为我们很快就可以使用存储在本地文件系统中的数据来运行测试了。
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识别Hadoop文件系统的URL 方案,就是通过一个FsUrlStreamHandlerFactory实例来调用在URL中的setURLStreamHandler-Factory 方法。这种方法在一个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不需要关闭。
下面是一个运行示例:
- % 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.