通用数据存储格式: Hadoop SequenceFile、HFile

简介:

Hadoop SequenceFile

详见:http://hadoop.apache.org/docs/r1.0.4/api/org/apache/hadoop/io/SequenceFile.html

3个概念:记录(Record)、块(Block)、文件(File)。

记录(Record): Hadoop SequenceFile的存储格式是通用的KV数据存储格式,key和value都是变长二进制数据。Record Len 表示的是key 和value 的占用的byte之和,Record压缩方式中 key 是不压缩。同步点Sync 作用数据恢复和扫描。当指定读取的位置不是记录首部的时候,通过读取一个同步点的记录,不至于读取数据的reader “迷失”。 (hadoop实现:每2000byte 就插入一个同步点,这个同步点占16 byte ,包括同步点标示符:4byte ,一个同步点的开销是20byte 。)对二进制数据,任何字符都可出现,故采用单字节的Sync标识难于区分数据和同步点,需要采用多字节的Sync(什么样的多个字节常被用来所Sync标识?0xFFFFFFFFFFFFFFFF?)。

块(Block):存储Block header和多个record数据。Hadoop SequenceFile可认为没有块概念,只有Block-Compressed SequenceFile才会将多个record压缩后一起存储,详见hadoop文档。

文件(File): 文件头+数据。存储如下信息:文件标识SEQ,key和value的格式说明,压缩相关信息,metadata(二级索引,The sequence file also can contain a “secondary” key-value list that can be used as file Metadata. This key-value list can be just a Text/Text pair, and is written to the file during the initialization that happens in the SequenceFile.Writer constructor, so you can’t edit your metadata.),Sync。常规的文件头需要的数据:文件标识、Sync标识、数据格式说明(含压缩)、文件元数据(时间、owner、权限等)、检验信息等。

HBase

Hbase MapFile

Hbase最初直接使用Hadoop的MapFile实现有序的Key存储(将数据和索引分别存成Hadoop SequenceFile)。用MapFile实现有序Key存储需要解决2个问题:1)如何删除数据?2)如何保证数据有序?解决方案:1)使用删除标志Type;2)内存中排序,达到阈值后写成MapFile(MemStore实现)。

MemStore 的方案意味这存在多个MapFile,这样对于读数据意味着可能需要扫描多个文件。为了减少需要读取的文件数,Hbase的设计者引入compaction:1) 将多个小文件合并成大文件;2)将所有的文件合并成一个大文件。

HFile V1

引入版本:HBase 0.20。核心特性:1)将index和数据合成一个文件(为减少index量,可只对每个块的首个key做索引);2)增加metadata特性。

The Meta block is designed to keep a large amount of data with its key as a String, while FileInfo is a simple Map preferred for small information with keys and values that are both byte-array. Regionserver’s StoreFile uses Meta-Blocks to store a Bloom Filter, and FileInfo for Max SequenceId, Major compaction key and Timerange info. This information is useful to avoid reading the file if there’s no chance that the key is present (Bloom Filter), if the file is too old (Max SequenceId) or if the file is too new (Timerange) to contain what we’re looking for.

HFile V2

引入版本:HBase 0.92。核心特性:1)引入多级索引;2)引入基于块的索引和Bloom Filter(解决问题:无需载入所有索引和Bloom Filter数据)。

从图上可知,HFileV2有3种索引:Root Index记录每个块首个key极其索引;Leaf Index记录块内每个record的索引;intermediate index记录每个块最后的key极其索引。(Since the index is moved to block level you then have a multi-level index, meaning each block has its own index (leaf-index).  The last key of each block is kept to create the intermediate/index that makes the multilevel-index b+tree like.)

前向扫描和后向扫描:The block header now contains some information: The “Block Magic” field was replaced by the “Block Type” field that describes the content of the block “Data”, Leaf-Index, Bloom, Metadata, Root-Index, etc. Also three fields (compressed/uncompressed size and offset prev block) were added to allow fast backward and forward seeks.

前缀压缩和差异压缩(Prefix and Diff Encoding):HBase的数据是有序的,因此Key差异不大,为了提高压缩比,引入2种针对性的压缩算法。

HFile V3

为了进一步提高压缩率:1)将块内的key和value分开存储, key存在块前面,value存在块后面。2)Compress timestamps。

相关文章

Hadoop I/O: Sequence, Map, Set, Array, BloomMap Files

HBase I/O – HFile

附录 oceanbase(类似HFile)

记录:oceanbase的记录value是有结构的二进制数据。格式为:keyLen(2B)+keyData+valueData。 其中valueData由一个或多个common::ObObj对象串化而成。详见:oceanbase\src\sstable\ob_sstable_row.h

块(Block)格式:block header + serialized rows + row index。详见:oceanbase\src\sstable\ob_sstable_block_builder.h

文件格式:详见:oceanbase\src\sstable\ob_sstable_writer.h

Leveldb 实现原理:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html
leveldb源代码分析: http://blog.nosqlfan.com/tags/leveldb


本文转自 zhenjing 博客园博客,原文链接:http://www.cnblogs.com/zhenjing/archive/2012/11/02/File-Format.html    ,如需转载请自行联系原作者

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 分布式计算 固态存储
Hadoop数据存储及管理
Hadoop数据存储及管理
|
6月前
|
存储 分布式计算 监控
Hadoop冗余数据存储
【4月更文挑战第13天】Hadoop的HDFS分布式文件系统通过数据块划分、冗余存储(副本创建)和多样化存储类型提升可靠性与扩展性。NameNode监控副本数量,确保数据安全。使用数据压缩算法节省空间,数据本地化优化提高效率。支持并行处理,实现高效大规模数据处理。
77 1
|
6月前
|
存储 分布式计算 Hadoop
[hadoop3.x]HDFS存储策略和冷热温三阶段数据存储(六)概述
[hadoop3.x]HDFS存储策略和冷热温三阶段数据存储(六)概述
123 0
|
存储 分布式计算 负载均衡
Hadoop生态系统中的数据存储技术:HDFS的原理与应用
Hadoop生态系统中的数据存储技术:HDFS的原理与应用
|
SQL 存储 数据库
Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)
1.1 Hive简介 1.1.1   什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 1.1.2   为什么使用Hive Ø  直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难度太大   Ø  为什么要使用Hive 操作接口采用类SQ
26870 0
|
存储 分布式计算 Hadoop
Hadoop支持的文件格式之SequenceFile(下)
Hadoop支持的文件格式之SequenceFile(下)
134 0
Hadoop支持的文件格式之SequenceFile(下)
|
分布式计算 Hadoop
Hadoop支持的文件格式之SequenceFile(上)
Hadoop支持的文件格式之SequenceFile(上)
198 0
|
存储 分布式计算 Linux
基于Hadoop生态系统的一种高性能数据存储格式CarbonData(性能篇)
CarbonData在数据查询的性能表现比Parquet好很多,在写一次读多次的场景下非常适合使用;社区比较活跃,响应也很及时。目前官网发布版本1.3.0与最新的spark稳定版Spark2.2.1集成,增加了支持标准的Hive分区,支持流数据准实时入库等新特性,相信会有越来越多的项目会使用到。
3973 0
|
存储 编解码 分布式计算

相关实验场景

更多