Java接口之从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中读取数据。

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

// 通过 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.coptyBytes(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 cound not see,

On account of his Beaver Hat.

哈哈

你可能感兴趣的:(Hadoop)