Hadoop学习笔记0003——从Hadoop URL读取数据

Hadoop学习笔记0003——从Hadoop URL读取数据

HadoopURL读取数据

 

要从Hadoop文件系统中读取文件,一个最简单的方法是使用java.net.URL对象来打开一个数据流,从而从中读取数据。一般的格式如下:

InputStream in = null;  
try {  
     in = new URL("hdfs://host/path").openStream();  
     // process in  
} finally {  
     IOUtils.closeStream(in);  
}<span style="font-weight: bold;">
</span>

这里还需要一点工作来让Java识别Hadoop文件系统的URL 方案,就是通过一个FsUrlStreamHandlerFactory实例来调用在URL中的setURLStreamHandler-Factory方法。这种方法在一个Java虚拟机中只能被调用一次,因此一般都在一个静态块中执行。这个限制意味着如果程序的其他部件(可能是不在你控制中的第三方部件)设置一个URLStreamHandlerFactory,我们便无法再从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不需要关闭。


实例操作如下:

1、新建一个Map/Reduce Project项目

技术分享
技术分享

2、建立一个URLCat类,包名称com.hadoop.test

package com.hadoop.test;

import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
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);  
	    }  
	}  
} 

技术分享

3、测试

URLCat界面右击选择Run As->Run Configurations

技术分享
技术分享

4、测试结果

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。