1.引子

HFile(HBaseFile)是HBase使用的一种文件存储格式的抽象,

目前存在两种版本的HFile:HFileV1和HFileV2

HBase0.92之前的版本仅支持HFileV1,

HBase0.92/0.94同时支持HFileV1和HFileV2。

以下分别是HFileV1/V2的结构图:

HFileV1

HFileV2

图中的数据块(Datablock)正是实际存放应用数据的地方,

每个数据块又由一系列的KeyValue组成,并且这些KeyValue之间是按Key升序排列的,

本文将说明KeyValue到底是什么以及当KeyValue越来越多时出现大量类似的数据有哪些算法能减少重复?

首先来看一个例子:

假设需要将用户的基本信息以及正在参与的开源项目的有关信息存入HBase:

Java代码
  1. 用户基本信息参与的开源项目

  2. ————————————————-

  3. 用户Id职业性别tomcathbase

  4. ————————————————-

  5. zhh2009码农男提patch打酱油提patch打酱油

  6. 用户Id职业性别tomcatant

  7. ————————————————-

  8. jdd1999码神男创始人创始人

  9. ———————————————————

  10. 表1.1

用户基本信息                   参与的开源项目
---------------------       ----------------------------
用户Id    职业   性别          tomcat           hbase
---------------------       ----------------------------
zhh2009   码农   男            提patch打酱油    提patch打酱油
用户Id    职业   性别          tomcat           ant
---------------------       ----------------------------
jdd1999   码神   男            创始人           创始人
---------------------------------------------------------
表1.1

从这个例子来看,用户的基本信息比较好确定,但是参与的开源项目不确定且在开源项目中扮演的角色也不确定,

所以用关系数据库不太好建表,因为不知道具体有多少列,也无法把相关的列归成一个组。

1.1列族

HBase是一种基于列的数据库,相关的列可以归到一个列族(ColumnFamily),

每个列族中具体有哪些列不必事先知道,可以在需要的时候添加,比如在用户基本信息中为zhh2009加入email这样的列,

上例中”用户基本信息”和”参与的开源项目”可以作为两个列族,

不同的列族在HBase内部通常对应一个目录,这样不同的列值只会放到它所属的列族目录下。

1.2rowKey

我们希望通过查询某个列就能把同一个列族或多个列族中的信息取出来,用户Id就是这样的列,

比如当我们要查询zhh2009的邮箱和参与的开源项目时,根据用户Id来查就不会查到jdd1999的信息,

在HBase中称这样的列为rowKey。

HBase是如何存放上例中的信息呢?

将用户Id这一列抽出来作为rowKey,把上面的信息按如下格式扁平化:

Java代码
<rowKey,  列族名称,       列名   => 列值>
—————————————————–
<zhh2009, 用户基本信息,   职业   => 码农>
<zhh2009, 用户基本信息,   性别   => 男>
<zhh2009, 参与的开源项目, tomcat => 提patch打酱油>
<zhh2009, 参与的开源项目, hbase  => 提patch打酱油><jdd1999, 用户基本信息,   职业   => 码神>
<jdd1999, 用户基本信息,   性别   => 男>
<jdd1999, 参与的开源项目, tomcat => 创始人>
<jdd1999, 参与的开源项目, ant    => 创始人>
—————————————————–表1.2
&lt;rowKey,  列族名称,       列名   =&gt; 列值&gt;
-----------------------------------------------------
&lt;zhh2009, 用户基本信息,   职业   =&gt; 码农&gt;
&lt;zhh2009, 用户基本信息,   性别   =&gt; 男&gt;
&lt;zhh2009, 参与的开源项目, tomcat =&gt; 提patch打酱油&gt;
&lt;zhh2009, 参与的开源项目, hbase  =&gt; 提patch打酱油&gt;
&lt;jdd1999, 用户基本信息,   职业   =&gt; 码神&gt;
&lt;jdd1999, 用户基本信息,   性别   =&gt; 男&gt;
&lt;jdd1999, 参与的开源项目, tomcat =&gt; 创始人&gt;
&lt;jdd1999, 参与的开源项目, ant    =&gt; 创始人&gt;
-----------------------------------------------------
表1.2

表1.2中的每一行在HBase中对应一个KeyValue,

“=>”左边的是KeyValue中的”Key”,”=>”右边对应KeyValue中的”Value”。

当然这只是KeyValue的一个简化格式,内部格式并非那么简单,我们接下来看看真实的KeyValue是怎样的?

2.KeyValue内部格式

KeyValue内部格式可以分成三部份:头、Key、Value,如表2.1所示

Java代码
  1. 名称   字节数说明

  2. ——————————————————————–

  3. keyLength  4表示Key所占的总字节数

  4. valueLength4表示Value所占的总字节数

  5. rowKeyLength2表示rowKey所占的字节数

  6. rowKeyrowKeyLengthrowKey

  7. columnFamilyLength1表示列族名称所占的字节数

  8. columnFamilycolumnFamilyLength列族名称

  9. columnNamecolumnNameLength列名

  10. timestamp8时间戳

  11. type1Key类型,比如是新增(Put),还是删除(Delete)

  12. valuevalueLength列值

  13. ——————————————————————–

  14. 表2.1

名称             字节数                  说明
--------------------------------------------------------------------
keyLength           4                     表示Key所占的总字节数
valueLength           4                     表示Value所占的总字节数
rowKeyLength          2                     表示rowKey所占的字节数
rowKey                rowKeyLength          rowKey
columnFamilyLength    1                     表示列族名称所占的字节数
columnFamily          columnFamilyLength    列族名称
columnName            columnNameLength      列名
timestamp             8                     时间戳
type                  1                     Key类型,比如是新增(Put),还是删除(Delete)
value                 valueLength           列值
--------------------------------------------------------------------
表2.1

keyLength和valueLength组成头部,

rowKeyLength到type这7项组成Key,最后一项value代表第三部份:Value,

上面有个地方值得注意,在columnFamily前面有columnFamilyLength,

但是在columnName之前并没有columnNameLength这一项,为了节省空间,这不是必需的,

当在解析KeyValue时,通过keyLength-8(timestamp)-1(type)就可以确定columnName在此KeyValue中的结束位置。

把表1.2中的前两行按表2.1中的格式生成两个KeyValue:

KeyValueA代表:<zhh2009,用户基本信息,职业=>码农>

KeyValueB代表:<zhh2009,用户基本信息,性别=>男>

Java代码
名称             字节数                  KeyValue A        KeyValue B
—————————————————————————-
keyLength           4                     35                35
valueLength           4                     4                 2rowKeyLength          2                     7                 7
rowKey                rowKeyLength          zhh2009           zhh2009
columnFamilyLength    1                     12                12
columnFamily          columnFamilyLength    用户基本信息      用户基本信息
columnName            columnNameLength      职业              性别
timestamp             8                     1329663787364     1329663787364
type                  1                     4(Put)            4(Put)value                 valueLength           码农              男
—————————————————————————-表2.2

名称             字节数                  KeyValue A        KeyValue B
----------------------------------------------------------------------------
keyLength           4                     35                35
valueLength           4                     4                 2

rowKeyLength277
rowKeyrowKeyLengthzhh2009zhh2009
columnFamilyLength11212
columnFamilycolumnFamilyLength用户%E

转载于:https://blog.51cto.com/aliapp/1327588

HBase HFile与Prefix Compression内部实现全解–KeyValue格式相关推荐

  1. Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    编者按:HDFS和MapReduce是Hadoop的两大核心,除此之外Hbase.Hive这两个核心工具也随着Hadoop发展变得越来越重要.本文作者张震的博文<Thinking in BigD ...

  2. 第一百零八期:比较容易理解的Hbase架构全解,10分钟学会,建议收藏

    依然是Hadoop组件的讲解,今天说到HBase 架构,都是一字一句打出来的,希望各位转发加关注,会一直给大家写优质的内容. 作者:IT技术管理那些事儿 依然是Hadoop组件的讲解,今天说到HBas ...

  3. 安卓文件操作全解:内部文件、公共文件、私有文件、app静态文件

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓文件操作全解:内部文件.公共文件.私有文件.app静态文件. 读内部文件(当前应用程序文件夹下文件) public static String o ...

  4. Thinking in BigData(八)大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

          纯干货:Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解. 通过这一阶段的调研总结,从内部机理的角度详细分析,HDFS.MapReduce.Hbase.H ...

  5. mapper命名规范_Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  6. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 - 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨森! ...

  7. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  8. 技术-2022-05-《Spring cloud Alibaba全解》阅读笔记

    技术-2022-05-<Spring cloud Alibaba全解> 创建时间: 2022/5/22 15:21 更新时间: 2023/2/17 8:52 作者: HelloXF 第一章 ...

  9. 生成对抗网络gan原理_中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解...

    开发者社区技术周刊又和大家见面了,萌妹子主播为您带来第三期"开发者技术联播".让我们一起听听,过去一周有哪些值得我们开发者关注的重要新闻吧. 中国首个芯片大学,南京集成电路大学即将 ...

最新文章

  1. 从阿里前端工程化中台实践,看中台建设的舍与得
  2. Java学习笔记--继承和多态(下)
  3. Spring 3.1和Hibernate的持久层
  4. 钉钉产品介绍_钉钉正式推出智能OA:免费开放、一站解决“人财物事”管理难题...
  5. 详解网络数字电视的实现方法与关键技术
  6. python3+requests+unittest_python3+requests+unittest:接口自动化测试(一)
  7. ae可围绕帧拖动放大插件:Drag Zoom Pro for AE mac(兼容M1)
  8. 使用Express和MongoDB构建CRUD应用程序-第2部分
  9. 优秀logo设计解析_日本的logo设计为什么那么优秀?
  10. jQuery 基本效果
  11. adodb.connection id password windows用户_Windows 12发布了?一款号称可以取代win10的山寨Windows系统...
  12. flutter html 加载_实操 | 在 Flutter 中创建通信桥
  13. 2019年5月的Flag!
  14. Python 查询全年天数
  15. 2的负x次幂图像_函数Y等于2的X次方图像怎么画?求过程
  16. 论文阅读翻译笔记之Incentives build robustness in BitTorrent
  17. codeforces 702F 可持久化平衡树
  18. C/C++ 开发利器 CLion安装与配置
  19. Eureka相关总结
  20. angular报错信息之 'zmz-select' is not a known element

热门文章

  1. UVa11134 Fabled Rooks(贪心算法)
  2. Button的使用(二):从资源文件中
  3. 无法加载指定的元数据资源(转载)
  4. luogu 3806
  5. IntelliJ IDEA 2017 注册方法
  6. ORM 和 JDBC有何不一样
  7. javacript实现不被浏览器拦截打开新窗口
  8. [Arduino] 学习总结小合集(更新ING)
  9. mysql字符调整_mysql字符集调整
  10. 散粒噪声是白噪声吗_5种常见的内部噪声,你都清楚吗?