9.5 HDFS常用Java API详解

9.1 中已经了解了Java API的重要性,本节深入介绍Hadoop的Filesystem类与Hadoop文件系统进行交互的API。

9.5.1 使用Hadoop URL读取数据

如果想从Hadoop中读取数据,最简单的办法就是使用java.net.URL对象打开一个数据流,并从中读取数据,一般的调用格式如下:


InputStream in=null;

try{

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

//process in

}finally{

IOUtils.closeStream(in);

}


这里要进行的处理是,通过FsUrlStreamHandlerFactory实例来调用在URL中的setURL-StreamHandlerFactory方法。这种方法在一个Java虚拟机中只能调用一次,因此放在一个静态方法中执行。这意味着如果程序的其他部分也设置了一个URLStreamHandlerFactory,那么会导致无法再从Hadoop中读取数据。

读取文件系统中的路径为hdfs://NameNodeIP/user/ubuntu/In/hello.txt的文件hello.txt,如例9-1所示。这里假设hello.txt的文件内容为“Hello Hadoop!”。

例9-1:使用URLStreamHandler以标准输出显示Hadoop文件系统文件


package cn.edn.ruc.cloudcomputing.book.chapter09;

import java.io.*;

import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.filecache.DistributedCache;

import org.apache.hadoop.conf.*;

import org.apache.hadoop.io.*;

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);

}

}

}


然后在Eclipse下设置程序运行参数为:hdfs://NameNodeIP/user/ubuntu/In/hello.txt,运行程序即可看到hello.txt中的文本内容。

需要说明的是,这里使用了Hadoop中简洁的IOUtils类来关闭finally子句中的数据流,同时复制输出流之间的字节(System.out)。例9-1中用到的IOUtils.copyBytes()方法,其中的两个参数,前者表示复制缓冲区的大小,后者表示复制后关闭数据流。