当前位置: > Linux集群 > Hadoop >

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

时间:2014-09-15 03:27来源:linux.it.net.cn 作者:it

问题描述:从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
(责任编辑:IT)
------分隔线----------------------------