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()方法,其中的两个参数,前者表示复制缓冲区的大小,后者表示复制后关闭数据流。