`
thomas0988
  • 浏览: 472897 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

HFile详解-基于HBase0.90.5

 
阅读更多

1. HFile详解

HFile文件分为以下六大部分

 

序号

名称

描述

1

数据块

由多个block()组成,每个块的格式为:

[块头] + [key] + [value] + [key] + [value]

2

元数据块

元数据是key-value类型的值,但元数据快只保存元数据的value值,元数据的key值保存在第五项(元数据索引块)中。

该块由多个元数据值组成。

3

fileInfo

该块保存与HFile相关的一些信息。

fileInfo是以key值排序key-value类型的值。基本格式为:

keyValue元素的个数 +

key + value类型id + value +

key + value类型id + value +

 ……

4

数据索引块

该块的组成为:

索引块头 +

(数据块在文件中的偏移 + 数据块长 + 数据块的第一个key +

(数据块在文件中的偏移 + 数据块长 + 数据块的第一个key +

……

5

元数据索引块

该块组成格式同数据块索引,只是某部分的意义不一样,组成格式:

索引块头 +

(元数据在文件中的偏移 + 元数据value + 元数据key +

(元数据在文件中的偏移 + 元数据value + 元数据key +

……

6

HFile文件尾

该块记录了其他各块在hfile文件中的偏移信息和其他一些元信息。组成格式如下:

文件尾 +

Fileinfo偏移 +

数据块索引偏移 +

数据块索引个数 +

元数据索引偏移 +

元数据索引个数 +

数据块中未压缩数据字节数 +

数据块中全部数据的key-value个数 +

压缩代码标识 +

版本标识

 

1.1.数据块详解

数据块组成图如下:

 

Data Block Magic

{'D', 'A', 'T', 'A', 'B', 'L', 'K', 42 }

key

value

key

value

key

value

key

value

……

key

value

key

value

Data Block Magic

{'D', 'A', 'T', 'A', 'B', 'L', 'K', 42 }

key

value

key

value

key

value

key

value

……

key

value

key

value

Blocks ……

数据块部分由多个block块组成,每个数据块由块头 + 多个cell(key-value)集合组成,如上图。每个数据块的大小在创建表的列族的时候可以指定,默认为(64 * 1024)。

1.         块大小的设定由HColumnDescriptor.setBlockSize(int)指定,默认(64 * 1024)。

2.        块大小设置,块设置的越小,访问速度越快,但数据块索引越大,消耗的内存越多。因为在加载HFile时会把数据块索引全部加载到内存中。

数据块组成说明:

1.         Data Block Magic数据块头,8字节,固定字节如下:{'D', 'A', 'T', 'A', 'B', 'L', 'K', 42 }

2.         key – 4字节整型,记录每个cellkey的长度。

3.         value – 4字节整型,记录每个cellvalue的长度。

4.         key – cellkey值,byte[]类型,组成如下:

rowKey的长(2字节)+ rowKey + family的长(1字节) + family + qualify + timestampe(8字节)  + keyType类型(1字节)

1) rowKey的长度不能大于0x7fff(32767).

2) rowKey不能为空。

3) family(列族)的长度不能大于0x7f(127)

4) qualify(限定符)的长度不能大于(0x7fffffff(2147483647) – row长度 – family长度)。

5.         value – cellvalue值,byte[]类型,value值不能为空。

 

例如:hbase中有一个表(student,其中有一个列族(info),该列族不压缩。其中的rowkey用学号表示,现在插入一个记录(rowkey='033', qualify='age', value='19')。那么该记录将被表示成一个cell(key-value)保存到HFile中,那么该cellHFile中的内容如下:

 

字节表示

key

{0,0,0,24}

value

{0,0,0,2}

key

{0,3}+{'0', '3', '3'}+{4}+{'i', 'n', 'f', 'o'}+{'a', 'g', 'e'}+{0,0,0,0,0,0,0,8}+{4}

value

{'1', '9'}

 

问题:

1.       块大小的设置策略?

2.       keyType的说明?

3.       compress压缩的说明?

 

1.2.元数据块详解

每个元数据是key-value类型的值,新增的元数据会按照从小到大的顺序排序。

StoreFile中,如果使用BloomFilter,StoreFile将会把BloomFilter的信息保存到HFile中的元数据中, 元数据块中只保存元数据的value值,key值保存在元数据索引块中。格式如下:

 

Meta Block Magic

{'M', 'E', 'T', 'A', 'B', 'L', 'K', 99 }

Meta Data Value

Meta Block Magic

{'M', 'E', 'T', 'A', 'B', 'L', 'K', 99 }

Meta Data Value

……

       每个元数据由元数据头+元数据值组成。

 

1.3.FileInfo详解

fileInfo中保存的信息为key-value类型的值,其中keyvalue都是byte[]类型。每个新增的值在内部都以值key顺序从小到大进行排序。fileInfo保存了与该HFile相关的一些信息,其中有系统保留的一些固定的值,这些值的key”hfile.”为前缀。也可以保存用户自定义的一些值,但这些值的key不能以”hfile.”开头。其中系统内部保留的一些值如下:

 

key(字符串表示,实际以二进制存储)

value

LASTKEY

hfile.LASTKEY

HFile中的数据块中的最后一个值的key, 该值如果为空则不进行保存

AVG_KEY_LEN

hfile.AVG_KEY_LEN

HFile中的数据块中的所有值key的平均长度。

AVG_VALUE_LEN

hfile.AVG_VALUE_LEN

HFile中的数据块中的所有值value的平均长度。

COMPARATOR

hfile.COMPARATOR

HFile中的数据块中的值都是以值的key进行排序来存放的,而key的组成比较复杂,这就需要一个key的比较器类,而该值保存了key值比较器的类的名称。

 

fileInfoHFile中的格式如下:

 

filInfo中所有值(key-value)的个数,整型

key

value类型标识

value

key

value类型标识

value

……

fileInfo各项说明:

1.       filInfo中所有值(key-value)的个数,整型,四字节。

2.       key值,保存fileInfo中值得key值。在HFile中的组成为

key+key

其中key长以压缩的整型保存,整型类型包括(byte,short,int,long),如果该整数用i表示,详细说明如下:

1.      -112 <= i <= 127 时,用一个字节保存实际值。

2.      其他情况下,第一个字节表示该整型与正负与该整数占字节长度,随后存储的是从该整数补码的高位算起的第一个非0字节的所有值。如果第一个字节为v,详细说明如下:

a)        -120<=i<=-113时,表示该值为正数,该数所占字节为-(v+112)

b)       -128<=i<=-121时,表示该值为负数,该数所占字节为-(v+120)

例如:

 

原始值

压缩后,以字节表示

说明

-87

{-87}

第一种情况

127

{127}

第一种情况

-1246

{-122} + {4, -35}

第二种情况的b类型。{-122}表示该数为负数,并且所占字节长度为-(-122+120)=2字节。其中{4,-35}保存的是-1246的补码1245的第一个非0字节开始的所有字节。124516进制为0x04DD,0字节共2个,第一个为0x04(4),第二个为0xDD(-35),组合一起为{-122, 4,-35}

130

{-113} + {-126}

第二种情况的a类型。{-113}表示该数为正数,并且所占字节长度为-(-113+112)=1字节。其中{-126}保存的是130的补码130的第一个非0字节开始的所有字节。13016进制为0x04DD,0字节共2个,第一个为0x04(4),第二个为0x82(-126),组合一起为{-113, -126}

 

3.       value值,保存fileInfo中值的value值。在HFile中的组成为

value+value

其中value长以压缩的整型保存,压缩整型具体格式参考key值中关于压缩整型的说明。

 

1.4.数据块索引

数据块索引保存的是每一个数据块在HFile文件中的位置、大小信息以及每个块的第一个cellkey值。格式如下:

 

Index Block Magic

{'I', 'D', 'X', 'B', 'L', 'K', 41, 43 }

block offset

block size

block first key

block offset

block size

block first key

……

block offset

block size

block first key

格式各项说明:

1.       block offset 块在HFile中偏移,long(8字节)

2.       block size 块大小,int(4字节)

3.       block first key 块中第一个cell(key-value)值得key.该值的组成为(key的长(压缩整型表示)+key值)

 

1.5.元数据块索引

该数据块的格式与数据库索引相同,元数据块索引保存的是每一个元数据在HFile文件中的位置、大小信息以及每个元数据的key值。格式如下:

 

Index Block Magic

{'I', 'D', 'X', 'B', 'L', 'K', 41, 43 }

meta offset

meta size

meta name

meta offset

meta size

meta name

……

meta offset

meta size

meta name

格式各项说明:

1.       meta offset 元信息在HFile中偏移,long(8字节)

2.       meta size 元信息数据大小,int(4字节)

3.       meta name 元信息中的key.该值的组成为(key的长(压缩整型表示)+key值)

 

1.6.文件尾

文件尾主要保存了该HFile的一些基本信息。格式比较简单,如下:

 

Trailer Block Magic

{'T', 'R', 'A', 'B', 'L', 'K', 34, 36 }

FileInfo Offset (long)

Data Index Offset (long)

Data Index Count (int)

Meta Index Offset (long)

Meta Index Count (int)

Total Uncompressed Bytes (long)

Entry Count (int)

Compression Codec (int)

Version (int)

说明如下:

1.       FileInfo Offset – FileInfo信息在HFile中的偏移。long(8字节)

2.       DataIndex Offset – 数据块索引在HFile中的偏移。long(8字节)

3.       DataIndex Count – 数据块索引的个数。int(4字节)

4.       MetaIndex Offset – 元数据索引块在HFile中的偏移。long(8字节)

5.       MetaIndex Count – 元数据索引块的个数。int(4字节)

6.       TotalUncompressedBytes – 未压缩的数据块部分的总大小。long(8字节)

7.       Entry Count – 数据块中所有cellkey-value)的个数。int(4字节)

8.       Compression Codec – 压缩算法为enum类型,该值表示压缩算法代码。(LZO-0GZ-1NONE-2,int(4字节)

9.       Version – 版本信息。当前该版本值为1. int(4字节)

================================================================

  因为一直在做hbase的应用层面的开发,所以体会的比较深的一点是hbase的表结构设计会对系统的性能以及开销上造成很大的区别,本篇文章先按照hbase表中的rowkey、columnfamily、column、timestamp几个方面进行一些分析。最后结合分析如何设计一种适合应用的高效表结构。

分享到:
评论

相关推荐

    hfile-to-hbase:处女发表

    hfile 到 hbase 处女发表

    MapReduce生成HFile入库到HBase 可能需要的jar包

    MapReduce生成HFile入库到HBase 可能需要的jar包,一共有3个 可以直接放在每台机器的${HADOOP_HOME}/lib下 hadoopHadoop 1.1.2 + hbase 0.94.6.1

    hive-hbase-generatehfiles

    Hive HBase生成HFile 该项目包含一个示例,该示例利用Hive HBaseStorageHandler生成HFile。 这种模式提供了一种方法,用于获取已存储在Hive中的数据,将其导出为HFile,并从这些HFile批量加载HBase表。概述HFile生成...

    yl-hbase-rep:hbaseplicationsnapshot实现机制,源码解析,以及复制对等体的实现-源码解析

    yl-hbase-rep hbase快照,复制实现机制,源码解析 复制对等方的实现代码 批量加载代码示例 ...也可以通过编码的方式,通过bulkload生成hfile然后再合并到hbase 致谢 yl-hbase-rep实现机制参考了lily

    Hadoop数据迁移--从Hadoop向HBase载入数据

    一、将Hadoop中普通文本格式的数据转化为可被HBase识别的HFile文件,HFile相当于Oracle中的DBF数据 文件。 二、将HFile载入到HBase中,该过程实际就是将数据从一个地移动到HBase某表数据的存放地。

    Hbase中文文档

    3.1. 从HBase 0.20.x or 0.89.x 升级到 HBase 0.90.x 3.2. 从 0.90.x 到 0.92.x 4. The HBase Shell 4.1. 使用脚本 4.2. Shell 技巧 5. 数据模型 5.1. 概念视图 5.2. 物理视图 5.3. 表 5.4. 行 5.5. 列族 5.6. Cells...

    spark-hbase:用于将 Spark 与 Apache HBase 数据结合使用的集成实用程序

    Spark SQL HBase 库 用于将 Spark 与 Apache HBase 数据结合使用的集成实用程序。 支持 基于 HBase 读取的扫描 ... 基于 HBase 读取的分析 HFile 基于 HBase 写入的批量加载 要求 这个库需要 Spark 1.2+

    BigGeoDataHBaseLoader:HBase矢量大数据快速入库工具

    1、在HBase shell中创建数据表 create '表名', {NAME=&gt;'Polygon/Polyline/Point'} 2、将要处理的tsv格式数据存储到HDFS上 ...hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles HFile路径 空间数据表名

    HBASE hfile v2 format

    hbase hfile v2 format draft 描述存储结构

    hadoop mr file2hfile2hbase

    NULL 博文链接:https://liuyq1991.iteye.com/blog/2109364

    hbase1.x 跟2.x比较.docx

    hbase1.x 跟2.x比较.docx

    HBase用户手册-v2.2.docx

    2.2 hbase的应用 7 2.3 HBase的体系结构简介 8 2.4 HBase的访问方式 9 2.5 适用场景 9 3 HBase使用流程 10 3.1 流程图 10 4 使用约定 12 4.1 权限管理 12 4.2 命名规范 12 5 模型设计 13 5.1 相关概念 13 5.2 模型...

    Hbase_目录结构.pptx

    /hbase/archive (1) 进行snapshot或者升级的时候使用到的归档目录。compaction删除hfile的时 候,也会把旧的hfile归档到这里等。 /hbase/corrupt (2) splitlog的corrupt目录,以及corrupt hfile的目录。

    分布式数据库HBase深入使用

    StoreFile是对HFile的封装。StoreFile真正存储在HDFS上。 所以写数据时先往HLog上写一份,再往MemStore上写一份。当MemStore达到一定大小则往StoreFile上写。若MemStore数据有丢失,则从HLog上恢复。 而读数据时先到...

    hbase技术介绍

    关于hbase的入门知识.hbase是基于hdfs建立的数据库,可扩展性强。

    Hadoop数据迁移--使用importtsv独步载入数据

    该工具是HBase提供的一个将HDFS数据转化为HBase数据库数据的一个工具。 其实现过程是,先将HDFS文件转复制并转化为HFile文件,然后将HFile移动并加载成为HBase的数据文件。

    HBaseBulkImportXML:如何将 XML 文件中的数据批量导入 HBase 表的示例

    使用 API 将数据放入工作中,但因为它必须遍历 HBase 的写入路径(即在将其刷新到 HFile 之前通过 WAL 和 memstore),它比您简单地绕过该批次并自己创建 HFiles 和将它们直接复制到 HDFS 中。 幸运的是 HBase 带有...

    HBase_XML_bulkimport

    使用 API 将数据放入工作中,但因为它必须遍历 HBase 的写入路径(即在将其刷新到 HFile 之前通过 WAL 和 memstore),它比您简单地绕过该批次并自己创建 HFiles 和将它们直接复制到 HDFS 中。 幸运的是 HBase 带有...

    hbase:habse自定义MR

    hbase从HBase表中导入数据到Hbase表中将fruit表中的一部分数据,通过MR迁入到fruit_mr表中从HDFS中导入数据到Hbase表中根据HDFS中的数据导入到fruit_hdfs表中

    Hadoop数据迁移--使用importtsv两步载入数据

    该工具是HBase提供的一个将HDFS数据转化为HBase数据库数据的一个工具。 其实现过程是,先将HDFS文件转复制并转化为HFile文件,然后将HFile移动并加载成为HBase的数据文件。

Global site tag (gtag.js) - Google Analytics