整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

2.8. Java 接口 2.8.1. 从Hadoop URL读取数据

hadoop 花牛 8℃ 0评论

在本小节中,我们要深入探索Hadoop的Filesystem类:它是与Hadoop的某一文件系统进行交互的API。虽然我们主要聚焦于HDFS实例,即 DistributedFileSystem,但总体来说,还是应该集成Filesystem抽象类,并编写代码,使其在不同文件系统中可移植。这对测试你编写的程序 非常重要,例如,你可以使用本地文件系统中的存储数据快速进行测试。

要从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不必关闭输入流。

下面是一个运行示例:

% 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.

转载请注明:全栈大数据 » 2.8. Java 接口 2.8.1. 从Hadoop URL读取数据

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址