《Hadoop权威指南:大数据的存储与分析》—3.5 Java接口
3.5 Java接口
在本小节中,我们要深入探索Hadoop的Filesystem类:它是与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程序能够识别Hadoop的hdfs 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.
- 点赞
- 收藏
- 关注作者
评论(0)