Hadoop实例之从Hadoop URL中读取数据

发布时间:2020-11-15编辑:脚本学堂
本文介绍下,从Hadoop URL中读取数据的方法与实例,有需要的朋友可以参考下。

问题描述:从Hadoop文件系统中读取文件,最简方法为:使用java.net.URL 对象打开数据流,进而从中读取数据。
 
例如:
 

复制代码 代码示例:
InputStream in = null; 
try{ 
    in = new URL("hdfs://host/path").openStream(); 
}finally{ 
    IOUtils.closeStream(in); 

 

如果要让java能够识别hadoop的hdfs 的url 方案,则需要一些额外的工作,可以采用通过FsUrlStreamHandlerFactory 的实例调用URL中的setURLStreamHandlerFactory方法。
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 
这种操作的问题:java虚拟机只能调用一次上述方法,因此通常在静态方法中去调用,即如果其他程序已经调用过这个方法,那么程序将不再能调用这个方案。
 
完整的例子:
 

复制代码 代码示例:
package gucas.xiaoxia; 
import java.io.InputStream; 
import java.net.URL; 
 
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; 
import org.apache.hadoop.io.IOUtils; 
 
public class CatURL { 
static { 
    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 

 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        InputStream input = null; 
        try { 
            input = new URL("hdfs://localhost/user/hadoop/map.txt") 
                    .openStream(); 
 
            IOUtils.copyBytes(input, System.out, 4096, false); 
 
        } catch (Exception e) { 
 
            e.printStackTrace(); 
 
        } finally { 
 
            IOUtils.closeStream(input); 
        } 
    } 
 

 

输出:
 

hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10 
hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10 
hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10 
hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10hello world:10