基于文件的数据结构

两种文件格式:

1、SequenceFile

2、MapFile

SequenceFile

1、SequenceFile文件是Hadoop用来存储二进制形式的<key,value>对而设计的一种平面文件(Flat File)。

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字节。

格式为记录数、键长度、键、值长度、值。

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

块压缩格式

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 configurable

无压缩方式、记录压缩、块压缩实例

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 = 1107

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.Reader进行读取

5)得到keyClass和valueClass

6)关闭流

详细操作与SequenceFile类似。

命令行查看二进制文件

hdfs dfs -text /liguodong/tmp.seq

Hadoop基于文件的数据结构及实例的更多相关文章

  1. Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】

    Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...

  2. 时间序列数据库概览——基于文件(RRD)、K/V数据库(influxDB)、关系型数据库

    一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper.这类工具附属于监控告警工具,底层没有 ...

  3. 关于实现一个基于文件持久化的EventStore的核心构思

    大家知道enode框架的架构是基于ddd+event sourcing的思想.我们持久化的不是聚合根的最新状态,而是聚合根产生的领域事件.最近我在思考如何实现一个基于文件的eventstore.目标有 ...

  4. 【转】基于Python的接口测试框架实例

    下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   背景 最近公司在做消息推送,那么自然就会产生很多接口,测试 ...

  5. 基于Python的接口测试框架实例

    文章来源:http://www.jb51.net/article/96481.htm 下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. ...

  6. FFMPEG基于内存的转码实例——输入输出视频均在内存

    我在6月份写了篇文章<FFMPEG基于内存的转码实例>,讲如何把视频转码后放到内存,然后通过网络发送出去.但该文章只完成了一半,即输入的数据依然是从磁盘文件中读取.在实际应用中,有很多数据 ...

  7. 基于springboot的flowable工作流实例实现

    基于springboot的flowable工作流实例实现 flowableUI 创建实例教程 https://www.cnblogs.com/nanstar/p/11959389.html Flowa ...

  8. 基于mysqld_multi实现MySQL多实例配置

    环境: 操作系统  CentOS7.5(已安装MySQL) 主机名    localhost 本机安装路径为 /usr/local/mysql 实验初始配置:所有主机关闭防火墙与selinux [ro ...

  9. 数据结构:用实例分析ArrayList与LinkedList的读写性能

    目录 背景 ArrayList LinkedList 实例分析 1.增加数据 2.插入数据 3.遍历数据 3.1.LinkedList遍历改进 总结 背景 ArrayList与LinkedList是J ...

随机推荐

  1. Codeforces Round #315 (Div. 2B) 569B Inventory 贪心

    题目:Click here 题意:给你n,然后n个数,n个数中可能重复,可能不是1到n中的数.然后你用最少的改变数,让这个序列包含1到n所有数,并输出最后的序列. 分析:贪心. #include &l ...

  2. Xcode6中怎么添加空工程模板

    亲们!是不是还在为Xcode中不能创建空工程模板苦恼,轩哥为大家准备了一个脚本,可以在Xcode6中直接创建空工程,跟以前一样一样的! 按照以下要求就可以了!下载地址:里面有一个文档有详细的步骤htt ...

  3. Android 应用内HttpClient 与 WebView 共享 Cookie

    DefaultHttpClient httpclient=....; String toUrl="https://cap.cityu.edu.hk/studentlan/details.as ...

  4. 运行计划之误区,为什么COST非常小,SQL却跑得非常慢?

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38321477 2014.7.31就晚20:30 My Oracle Support组猫大师 ...

  5. PL/SQL连64位Oracle11g R2 win7 64旗舰环境

    说明:使用的软件版本是PL/SQL Developer 7.0.1,Oracle服务器端安装在Windows7旗舰版上. 以下是我的步骤 1,先到Oracle网站下载客户端:http://www.or ...

  6. BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )

    虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...

  7. 设计模式(三)建造者模式Builder(创建型)

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

  8. qrcode 4.0.4 : Python Package Index

    qrcode 4.0.4 : Python Package Index qrcode 4.0.4 Download qrcode-4.0.4.tar.gz QR Code image generato ...

  9. Android 富文本框实现 RichEditText

    Android系统自带控件没有富文本框控件,如果想写一封带格式的邮件基本上不可能,EdtiText只有默认一种格式,显示不能滿足要求,!!正好项目需要研究了一下,开发了此控件,现将一些源代码开放一下, ...

  10. Websense一面、二面及Offer

    1.  写脚本打印当前目录(子目录)下文件内容中包含abc字符串文件 2.  用C写一个管道通信的程序:父进程向子进程写一个”hello word”字符串,子进程输出. 3.  解释I-node. 4 ...