从HadoopURL中读取数据
要从Hadoop文件系统中读取文件,最简单的方法是使用java.net.URL对象打开数据流,进而从中读取数据。具体格式如下。
InputStreamin=null;
try{
in=new URL(“hdfs://host/path”).openStream();
//process in
} finally{
IOUtils.closeStream(in);
}
让Java程序能够识别Hadoop的hdfs URL方案还需要一些额外的工作。这里采用的方法是通过FsUrlStreamHandlerFactory实例调用URL中的setURLStreamHandlerFactory方法。由于Java虚拟机只能调用一次上述方法,因此通常在静态方法中调用上述方法。这个限制意味着如果程序的其他组件(如不受你控制的第三方组件)已经声明了一个URLStreamHandlerFactory实例,将无法再使用上述方法从Hadoop中读取数据。例5-1展示的程序以标准输出方式显示Hadoop文件系统中的文件,类似于Unix中的cat命令。
例5-1 以标准输出方式显示Hadoop文件系统中的文件。
public classURLCat{
static{
URL.setURLStreamHandlerFactory(newFsUrlStreamHandlerFactory());
}
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不关闭输入流。
运行结果如下:
数据分析咨询请扫描二维码