hadoop FileSystem类和SequenceFile类实例

Hadoop的FileSystem类是与Hadoop的某一文件系统进行交互的API,虽然我们主要聚焦于HDFS实例,但还是应该集成FileSystem抽象类,并编写代码,使其在不同的文件系统中可移植,对于测试编写的程序非常重要。可以使用本地文件系统中的存储数据快速进行测试。

一、从Hadoop FileSystem读取数据

1、java.net.URL

private FileSystem fs;
    /**
     * 通过FsUrlStreamHandlerFactory实例调用java.net.URL对象的setURLStreamHandlerFactory方法,让java程序识别Hadoop的HDFS url
            每个java虚拟机只能调用一次这个方法,因此通常在静态方法中调用。这个限制意味着如果程序的其他组件已经声明了一个setURLStreamHandlerFactory实例,你
          将无法使用这种方法从hadoop中读取数据
     */
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

/**     * 读取hadoop文件系统中文件的内容(不推荐使用)     */    @Test    public void catFiles(){        InputStream inputStream=null;        try {            //调用java.net.URL对象打开数据流            inputStream=new URL("hdfs://s100:8020/user/enmoedu/test.txt").openStream();            //调用copyBytes函数,可以在输入流和输出流之间复制数据,            //System.out输出到控制台,第三个参数是设置缓冲区大小,最后一个,设置复制结束后是否关闭数据流            IOUtils.copyBytes(inputStream, System.out, 1024,false);        } catch (IOException e) {            e.printStackTrace();        }finally{            //关闭数据流            IOUtils.closeStream(inputStream);        }    }

执行结果:

hello chengpingyijun
hello enmoedu

2、org.apache.hadoop.fs.FileSystem

/**
     * 读取hadoop文件系统中文件的内容(推荐使用)
     */
    @Test
    public void fileSystemCat(){
        String url="hdfs://s100:8020/user/enmoedu/test.txt";
        Configuration configuration=new Configuration();
        InputStream inputStream=null;
        try {
            //通过给定的URI方案和权限来确定要使用的文件系统
            fs=FileSystem.get(URI.create(url),configuration);
            //FileSystem实例后,调用open()来获取文件的输入流
             inputStream=fs.open(new Path(url));
                 //调用copyBytes函数,可以在输入流和输出流之间复制数据,
                //System.out输出到控制台,第三个参数是设置缓冲区大小,最后一个,设置复制结束后是否关闭数据流
             IOUtils.copyBytes(inputStream, System.out, 1024,false);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭数据流
            IOUtils.closeStream(inputStream);
        }
    }

执行结果:

hello chengpingyijun
hello enmoedu

查看HDFS上test.txt中的内容

3、在HDFS上创建目录

在HDFS上查看在user/目录下没有test文件

/**
     * 创建目录
     */
    @Test
    public void creatDir(){
        String url="hdfs://s100:8020/user/test";
        //configuration封装了HDFS客户端或者HDFS集群的配置信息,
        //该方法通过给定的URI方案和权限来确定要使用的文件系统
        Configuration configuration=new Configuration();
        try {
            //通过给定的URI方案和权限来确定要使用的文件系统
            fs=FileSystem.get(URI.create(url), configuration);
            fs.mkdirs(new Path(url));
            System.out.println("========================");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行结果

4、在HDFS上删除目录

/**
     * 删除目录
     */
    @Test
    public void deleteDir(){
        String url="hdfs://s100:8020/user/test";
        Configuration configuration=new Configuration();
        try {
            //通过给定的URI方案和权限来确定要使用的文件系统
            fs=FileSystem.get(URI.create(url), configuration);
            fs.delete(new Path(url));
            System.out.println("========================");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行结果:

5、列出目录下的文件或目录名称示例

/**
     * 列出目录下的文件或目录名称示例
     */
    @Test
    public void listFiles(){
        String urls[]={"hdfs://s100:8020/user/","hdfs://s100:8020/user/test.txt"};
        Configuration configuration=new Configuration();
        try {
            //通过给定的URI方案和权限来确定要使用的文件系统
            fs=FileSystem.get(URI.create(urls[1]), configuration);
            //FileStatus类中封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、复本、所有者、及权限信息
            FileStatus file=fs.getFileStatus(new Path(urls[1]));
            //文件大小
            long lenthg=file.getLen();
            //块大小
            long size=file.getBlockSize();
            //最近修改时间
            long time=file.getModificationTime();
            //复本数
            int n=file.getReplication();
            //所有者
            String owner=file.getOwner();
            //权限信息
            String chmod=file.getPermission().toString();
            System.out.println("user目录下的方件有");
            System.out.println("====================================");
            //调用FileSystem中的listStatus()方法返回一个FileStatus[]数组
            FileStatus[] listFiles=fs.listStatus(new Path(urls[0]));
            //遍历listFiles
            for (int i = 0; i < listFiles.length; i++) {
                FileStatus fileStatus = listFiles[i];
                System.out.println(fileStatus.getPath().toString());
            }
            System.out.println("user目录下的文件所具有的属性");
            System.out.println("====================================");
            System.out.println("文件大小是:"+lenthg);
            System.out.println("块大小"+size);
            System.out.println("最近修改时间:"+time);
            System.out.println("复本数"+n);
            System.out.println("文件所有者"+owner);
            System.out.println("权限信息"+chmod);
            //关闭输入流
            fs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行结果

user目录下的方件有
====================================
hdfs://s100:8020/user/enmoedu
hdfs://s100:8020/user/hao.txt
hdfs://s100:8020/user/test
hdfs://s100:8020/user/test.txt
hdfs://s100:8020/user/yao.txt
hdfs://s100:8020/user/yhj.txt
user目录下的文件所具有的属性
====================================
文件大小是:35
块大小134217728
最近修改时间:1491376577359
复本数3
文件所有者enmoedu
权限信息rw-r--r--

6、查看文件系统中文件存储的位置信息

/**
     * 查看文件系统中文件存储节点的位置信息
     */
    @Test
    public void locationFile(){
        //测试hdfs上hadoop-2.7.2.tar.gz包的位置信息,其中hadoop-2.7.2.tar.gz的大小是212046774kb约202M
        String url="hdfs://s100:8020/user/enmoedu/hadoop-2.7.2.tar.gz";
        //configuration封装了HDFS客户端或者HDFS集群的配置信息,
        //该方法通过给定的URI方案和权限来确定要使用的文件系统
        Configuration configuration=new Configuration();
        try {
            //通过给定的URI方案和权限来确定要使用的文件系统
            fs=FileSystem.get(URI.create(url), configuration);
            //FileStatus的getFileStatus()方法用于获取文件或目录的FileStatus对象
            FileStatus fileStatu=fs.getFileStatus(new Path(url));
            //通过getFileBlockLocations方法获取location节点信息,第一个参数FileStatus对象,第二个是起始,第三个是结束
            BlockLocation [] locationMsg=fs.getFileBlockLocations(fileStatu, 0, fileStatu.getLen());
            //遍历BlockLocation对象
            for (int i = 0; i < locationMsg.length; i++) {
                //获取主机名
                String hosts[] =locationMsg[i].getHosts();
                System.out.println("block_"+i+"_location:"+hosts[i]);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行结果

block_0_location:s102
block_1_location:s105

二、Hadoop SequenceFile的读写操作

SequenceFile是HDFS API提供的一种二进制文件支持,这种二进制文件直接将<key,value>序列化到文件中。

1、通过SequenceFile向方件中写入数据

/**
     * 通过SequenceFile向方件中写入内容
     */
    @Test
    public void wirteSequenceFile(){
        String [] text={"Right Here Waiting","Oceans apart, day after day","and I slowly go insane.",
                " I hear your voice on the line,","But it doesn‘t stop the pain. "};
        String url="hdfs://s100:8020/user/testsqu";
        Configuration configuration=new Configuration();
        //Writer内部类用于文件的写操作,假设Key和Value都为Text类型
        SequenceFile.Writer writer=null;
        try {
            fs=FileSystem.get(URI.create(url), configuration);
            //相当于java中的int
            IntWritable key=new IntWritable();
            Text value=new Text();
            writer=SequenceFile.createWriter(fs, configuration, new Path(url), key.getClass(), value.getClass());
            for (int i = 0; i < text.length; i++) {
                key.set(text.length-i);
                value.set(text[i%text.length]);
                //通过writer向文档中写入记录
                writer.append(key, value);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeStream(writer);
        }

    }

执行结果

2、通过SequenceFile读取文件中的类容

/**
     * 读取SequenceFile中的内容
     */
    @Test
    public void readSequenceFile(){
        String url="hdfs://s100:8020/user/testsqu";
        Configuration configuration=new Configuration();
        //Reader内部类用于文件的读取操作
        SequenceFile.Reader reader=null;
        try {
            fs=FileSystem.get(URI.create(url), configuration);
            reader=new SequenceFile.Reader(fs, new Path(url), configuration);
            Writable key=(Writable) ReflectionUtils.newInstance(reader.getKeyClass(),configuration);
            Writable value=(Writable) ReflectionUtils.newInstance(reader.getValueClass(), configuration);
            long position=reader.getPosition();
            while (reader.next(key, value)) {
                System.out.printf("[%s]\t%s\n",key,value);
                position=reader.getPosition();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeStream(reader);
        }
    }

执行结果

[5]	Right Here Waiting
[4]	Oceans apart, day after day
[3]	and I slowly go insane.
[2]	 I hear your voice on the line,
[1]	But it doesn‘t stop the pain.
时间: 2024-10-25 21:37:04

hadoop FileSystem类和SequenceFile类实例的相关文章

Java Class类以及获取Class实例的三种方式

T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>. [java] view plain copy print? public final class Class<T> extends Object  implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.r

类,对象与实例变量

类就是一类事物,而对象就是一个事物,一类事物中包含若干的事物(而这其中的具体的事物就是对象),比如说:车,但没法具体到哪辆车,这就是一个类的概念,而如果说,我家的那辆轿车,就可以想到那具体的一辆车,而这个具体的车就是对象的概念. 类变量:比较特殊的实例变量,用static修饰的,一个类共用这个变量,所有由这类生成的对象都共用这个变量,类装载时就分配存储空间.一个对象修改了变量,则所以对象中这个变量的值都会发生改变. 实例变量:从属于类,由类生成对象时,才分配存储空间,各对象间的实例变量互不干扰,

类、对象、实例

引自http://www.blogjava.net/dreamstone/archive/2007/03/04/101733.aspx 一种比较好理解的说法 类-->对象-->实例人类是类某个人是对象你是实例实例本身也是对象. 表现出来是这样的String 类String str   str是对象String str = "abc";  "abc"是实例,也是对象. 类.对象.实例

Ruby学习: 类的定义和实例变量

ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 def关键字开头,后面跟方法名及参数列表(如果有的话),以 end标识符结尾. 类也有构造函数,名字必须为initialize. 对象通过new来创建,new是类的方法. 举例如下: class Demo def initialize puts "begin create object"

Tstrings类简单介绍及实例

用TStrings保存文件;var  S: TStrings;begin  S := TStringList.Create();  { ... }  S.SaveToFile('config.txt', TEncoding.UTF8); Tstrings类简单介绍及实例 在DELPHI的程序开发过程中Tstrings类的使用是比较频繁的,下面就此类在DELPHI5的开发环境中进行一下简单的介绍及实例(注:本文只对tstrings类中的方法及属性进行介绍, 从其父类继承的属性及方法不属本文讨论之内

C#根据类名称创建类的实例

转:http://blog.csdn.net/ise_keven1/article/details/2070049 方案一: using   System;       using   System.Reflection; Type   type   =   Type.GetType("abc");     Activator.CreateInstance(type); 方案二: using   System;       using   System.Reflection;    

Adapter类下的Gallery实例详解

通常我们更多的继承BaseAdapter来编写自己的Adapter类,因为BaseAdapter类是其他Adapter类的基类.在世界的运用过程中呢,我们一般需要重写这类的一些方法: getCount() ;获取当前Adapter的Items数目 getItem(int position);获取相应Position(位置)的Item getItemId(int position);获取相应position的Item在LIst中的row id getView(int positon,View co

python的面向对象-类的数据属性和实例的数据属性相结合-无命名看你懵逼不懵逼系列

1. class Chinese: country='China' def __init__(self,name): self.name=name def play_ball(self,ball): print('%s 正在打 %s' %(self.name,ball)) p1=Chinese("北爷") print(p1.country)#这是访问的类的数据属性 p1.country="日本人"#增加了一个实例的数据属性 print(Chinese.country

(一)Python入门-6面向对象编程:02类的定义-类和对象的关系-构造函数-实例属性-实例方法

一:类的定义 如果把对象比作一个“饼干”,类就是制造这个饼干的“模具”. 我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”. 对象是类的具体实体,一般称为“类的实例”.类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”. 从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态).更具体一点:“方法代码是共享的,属性数据不共享”. Python中,“一切皆对象”.类也称为“类对象”,类的实例也称为“