(003)通过API操作HDFS,读取数据

Posted on 2018-08-27 21:45 sir_Lijun 阅读() 评论() 编辑 收藏

研读HADOOP权威指南,从而得知,从Java接口中,可以根据hadoop url读取数据,并且也可以根据filesystem API 读取数据。

一.我们根据hadoop url 读取数据。

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

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

public class UrlCat {
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) throws Exception {
        InputStream ins = null;
        try {
            ins = new URL("hdfs://192.168.1.1:9000/user/word.txt").openStream();
            IOUtils.copyBytes(ins, System.out, 1024, false);
        } finally {
            IOUtils.closeStream(ins);
        }
    }
}

  请copy代码的兄弟,适当的更改里面URL参数。其实根据URL.openStream得到InputStram流,  然后我们可以调用IOUtils类,并且在finally子句中关闭数据流,同时也可以在输入流和输出流中间复制数据(OutPutStream (System.out)),这样我们就在控制台上打印数据了。

二.根据FileSystem API读取数据

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;

public class HDFSUtilTest {
    @Test
    public void readHDFS() throws Exception {
        Configuration conn = new Configuration();
        conn.set("fs.defaultFS","hdfs://192.168.1.1:9000");
        FileSystem fs = FileSystem.get(conn);
        FSDataInputStream fis = fs.open(new Path("/user/word.txt"));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IOUtils.copyBytes(fis, baos, 1024);
        fis.close();
        System.out.println(new String(baos.toByteArray()));
    }

  首先强调一点,此文中Path导入的包import org.apache.hadoop.fs.Path ,而不是我们常规理解的Java.io,文件系统通过Hadoop Path对象来代表文件,我们可以将路径看作是hadoop文件系统的URL。FileSystem是一个通用的文件系统API,我们根据静态工厂方法获取实例,所以有FileSystem fs = FileSystem.get(conn);但是里面有一个参数 conn,这个参数Configuration对象,此对象封装了客户端或者服务器的配置,通过设置配置文件读取类路径来实现,剩下的又是输入流和输出流的事情。


版权声明:本文为sirlijun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sirlijun/p/9545006.html