Hadoop基于文件的数据结构及实例

Hadoop基于文件的数据布局及实例

基于文件的数据布局
两种文件格式:
1、SequenceFile
2、MapFile

SequenceFile
1、SequenceFile文件是Hadoop用来囤积二进制格局的<key,value>对而设计的风姿浪漫种平面文件(Flat
File卡塔尔(英语:State of Qatar)。

2、能够把SequenceFile当作四个器皿,把装有文件打包到SequenceFile类中得以飞速的对小文件进行仓储和拍卖。

3、SequenceFile文件并不依据其积累的key举办排序存款和储蓄,SequenceFile的内部类Writer**提供了append功能**。

4、SequenceFile中的key和value能够是随便档案的次序Writable大概是自定义Writable类型。

SequenceFile压缩
1、SequenceFile的里边格式决计于是不是启用压缩,假设是,要么是记录压缩,要么是块压缩。
2、三种类型:
A.无压缩类型:若无启用压缩(暗中同意设置),那么每一种记录就由它的笔录长度(字节数)、键的长短,键和值组成。长度字段为四字节。

B.记录压缩类型:记录压缩格式与无压缩格式基本雷同,区别的是值字节是用定义在头顶的编码器来压缩。注意,键是不减弱的。

C.块压缩类型:块压缩一遍减削四个记录,因而它比记录压缩更紧密,何况平日优先选项。当记录的字节数到达最小大小,才会增添到块。该最小值由io.seqfile.compress.blocksize中的属性定义。暗中认可值是1000000字节。格式为记录数、键长度、键、值长度、值。

无压缩格式与记录压缩格式

图片 1

块压缩格式

图片 2

SequenceFile文件格式的裨益:
A.扶助基于记录(Record)或块(Block)的数据压缩。
B.援救splittable,能够作为MapReduce的输入分片。
C.修正轻巧:首要担负修正相应的思想政治工作逻辑,而毫不构思实际的储存格式。
SequenceFile文件格式的害处:
弊病是急需贰个联合文件的长河,且合并后的文件将不便利查看。因为它是二进制文件。

读写SequenceFile
写过程:
1)创建Configuration
2)获取FileSystem
3)创设文件输出路径Path
4)调用SequenceFile.createWriter得到SequenceFile.Writer对象
5)调用SequenceFile.Writer.append追加写入文件
6)关闭流
读过程:
1)创建Configuration
2)获取FileSystem
3)创立文件输出路线Path
4)new四个SequenceFile.Reader举办读取
5)得到keyClass和valueClass
6)关闭流

org.apache.hadoop.io
Class SequenceFile
There are three SequenceFile Writers based on the
SequenceFile.CompressionType used to compress key/value pairs:
1、Writer : Uncompressed records.
2、RecordCompressWriter : Record-compressed files, only compress
values.
3、BlockCompressWriter : Block-compressed files, both keys & values are
collected in ‘blocks’ separately and compressed. The size of the ‘block’
is configurable1
无压缩格局、记录压缩、块压缩实例
package SequenceFile;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.CompressionType;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.compress.BZip2Codec;
import org.apache.hadoop.util.ReflectionUtils;

public class Demo01 {

    final static String uri= “hdfs://liguodong:8020/liguodong”;
    final static String[] data = {
        “apache,software”,”chinese,good”,”james,NBA”,”index,pass”
    };

    public static void main(String[] args) throws IOException {
        //1
        Configuration configuration = new Configuration();
        //2
        FileSystem fs = FileSystem.get(URI.create(uri),configuration);
        //3
        Path path = new Path(“/tmp.seq”);

        write(fs,configuration,path);
        read(fs,configuration,path);

    }

    public static void write(FileSystem fs,Configuration
configuration,Path path) throws IOException{
        //4
        IntWritable key = new IntWritable();
        Text value = new Text();
        //无压缩
        /*@SuppressWarnings(“deprecation”)
        SequenceFile.Writer writer = SequenceFile.createWriter
               
(fs,configuration,path,key.getClass(),value.getClass());*/
        //记录压缩
        @SuppressWarnings(“deprecation”)
        SequenceFile.Writer writer = SequenceFile.createWriter
                (fs,configuration,path,key.getClass(),
                        value.getClass(),CompressionType.RECORD,new
BZip2Codec());
        //块压缩
        /*@SuppressWarnings(“deprecation”)
        SequenceFile.Writer writer = SequenceFile.createWriter
                (fs,configuration,path,key.getClass(),
                value.getClass(),CompressionType.BLOCK,new
BZip2Codec());*/

        //5
        for (int i = 0; i < 30; i++) {
            key.set(100-i);
            value.set(data[i%data.length]);
            writer.append(key, value);
        }
        //6、关闭流
        IOUtils.closeStream(writer);       
    }

    public static void read(FileSystem fs,Configuration
configuration,Path path) throws IOException {
        //4
        @SuppressWarnings(“deprecation”)
        SequenceFile.Reader reader = new SequenceFile.Reader(fs,
path,configuration);
        //5
        Writable key = (Writable) ReflectionUtils.newInstance
                (reader.getKeyClass(), configuration);
        Writable value = (Writable) ReflectionUtils.newInstance
                (reader.getValueClass(), configuration);

        while(reader.next(key,value)){
            System.out.println(“key = ” + key);
            System.out.println(“value = ” + value);
            System.out.println(“position = “+ reader.getPosition());
        }
        IOUtils.closeStream(reader);
    }
}

运维结果:

key = 100
value = apache,software
position = 164
key = 99
value = chinese,good
position = 197
key = 98
value = james,NBA
position = 227
key = 97
value = index,pass
position = 258
key = 96
value = apache,software
position = 294
key = 95
value = chinese,good
position = 327
……
key = 72
value = apache,software
position = 1074
key = 71
value = chinese,good
position = 11071
MapFile
public class MapFile {
  /** The name of the index file. */
  public static final String INDEX_FILE_NAME = “index”;

  /** The name of the data file. */
  public static final String DATA_FILE_NAME = “data”;
}

MapFile是通过排序的目录的SequenceFile,能够依赖key实行搜寻。

与SequenceFile分歧的是, MapFile的Key一定要促成WritableComparable接口
,即Key值是可正如的,而value是Writable类型的。
能够行使MapFile.fix(卡塔尔国方法来重新建立索引,把SequenceFile调换到MapFile。
它有多少个静态成员变量:

static final String INDEX_FILE_NAME
static final String DATA_FILE_NAME

通过观看其目录构造得以观望MapFile由两部分构成,分别是data和index。
index作为文件的多少索引,首要记录了种种Record的key值,以致该Record在文书中的偏移地点。

在MapFile被访谈的时候,索引文件会被加载到内部存款和储蓄器,通过索引映射关系可高效定位到内定Record所在文书地点。
据此,相对SequenceFile来说,
MapFile的搜求功用是全速的,劣势是会消耗意气风发部分内部存款和储蓄器来存款和储蓄index数据。
需注意的是,
MapFile并不会把具备Record都记录到index中去,暗中同意情形下每间距128条记下存款和储蓄叁个索引映射。当然,记录间隔可人为改良,通过MapFIle.Writer的setIndexInterval(卡塔尔方法,或改换io.map.index.interval属性;

读写MapFile
写过程:
1)创建Configuration
2)获取FileSystem
3)创设文件输出路径Path
4)new一个MapFile.Writer对象
5)调用MapFile.Writer.append追加写入文件
6)关闭流
读过程:
1)创建Configuration
2)获取FileSystem
3)创立文件输出路线Path
4)new二个MapFile.里德r举办读取
5)得到keyClass和valueClass
6)关闭流

具体操作与SequenceFile相像。

指令行查看二进制文件
hdfs dfs -text /liguodong/tmp.seq

基于文件的数据布局二种文件格式: 1、SequenceFile 2、MapFile SequenceFile
1、SequenceFile文件是Hadoop用来存款和储蓄二进…

相关文章

发表评论