HBase体系结构

HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion服务器(HRegion Service)群和HBase Master服务器(HBase Master Server)构成。Hbase Master服务器负责管理所有的HRegion服务器,而Hbase中所有的服务器是通过Zookeeper来进行协调,并处理HBase服务器运行期间可能遇到的错误的。

1、HRegion

当表的大小超过设置的值时,HBase会自动地将表划分为不同的区域,每个区域包含所有行的子集。从物理上讲,一张表被拆分成了多块,每一块儿就是一个HRegion.一个HRegion会保存一表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面。

2、HRegion服务器

  所有的数据一般都是保存在HDFS中,用户通过一系列HRegion服务器获取这些数据,一台机器上一般只运行一个HRegion服务器,且每一个区段的HRegion也只会被一个HRegion维护。

  当用户需要更新数据的时候,他会被分配到对应的HRegion服务器上提交修改,这些修改先是被写到Hmemcache缓存和服务器的Hlog文件里面(Hmemcache是内存中的缓存,保存最新更新的数据数据:HLOG是磁盘上面的记录文件,它记录着所有的更新操作),在操作写入Hlog之后,commit()调用才会将其返回给客户端。

读取数据时,HRegion服务器会先访问Hmemcache缓存,如果缓存中没有该数据,才会回到Hstores磁盘上面寻找,每个列族都会有一个Hstore集合,每个Hstore集合包含很多具体的HstoreFile文件,这些文件都是B树结构,方便快速读取。

  启动时,每台HRegion服务器会检查自己的Hlog文件,看看最近一次执行flushcache之后有没有新的更新写入操作。如果没有,表示数据都已经更新到文件中了,如果有更新,服务器会把这些更新写高速缓存,然后调用flushcache写入到文件中。最后服务器会删除旧的Hlog文件,并开始让用户访问数据。

3、HBase Master服务器

  每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每台HRegion服务器它要维护哪些HRegion.当一台新的HRegion服务器登录到HMaster服务器时,HMaster会告诉它先等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它分配到其他HRegion服务器中。

4、ROOT表和META表

因为Hbase有合并和分割操作,如果正好在执行这些操作的过程中出现死机,那么就可能存在相同的 表名和开始主键,每个HRegion都有一个 regionId 来标识它的唯一性。所以一个HRegion的表达符最后是:表名+开始主键+唯一ID(tablename + startkey + regionId)。用这个识别符来区分不同的HRegion,这些数据就是元数据(META),而元数据本身也是被保存在HRegion里面的,所以我们称这个表为源数据表(META Table),里面保存的就是HRegion标识符和实际HRegion服务器的映射关系。

  元数据表是会不断增长的,也可能被分为几个HRegion,所以采用了一个根数据表(ROOT table),它保存了所有元数据表的位置,根数据表是不会被拆分的,永远存在于一个HRegion。

HBase数据模型

  (注意的是,每一条数据对应的时间戳都是用数字来表示,编号越大表示数据越旧,反之则表示数据越新)

参考《Hadoop 实战》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人云亦云

Chef

3717
来自专栏有趣的Python

最新Django2.0.1在线教育零基础到上线教程(五)1-3

演示地址: http://mxonline.mtianyan.cn 教程仓库地址1: https://github.com/mtianyan/DjangoGe...

6146
来自专栏GopherCoder

专栏:002 :python 文件操作

1515
来自专栏Linux驱动

13.Linux键盘按键驱动 (详解)

在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标:        实现键盘驱动,让开发板的...

3575
来自专栏张戈的专栏

WP Super Cache静态缓存插件纯代码版(兼容多域名网站)

中午,小熊发来一篇来自歧路亡羊博客的精彩教程:《wordpress 利用代码来实现缓存》。粗略看了一下,发现这个代码在几个月之前我就用过,不过由于此代码无法区分...

4927
来自专栏积累沉淀

Java程序员面试题集(86-115)

Java程序员面试题集(86-115) 摘要:下面的内容包括Struts 2和Hibernate的常见面试题,虽然Struts 2在2013年6月曝出高危漏...

2657
来自专栏全沾开发(huā)

NPM实用指北

NPM实用指北 npm作为下载node附送的大礼包,大家一定不会陌生。 然而关于npm,估计大量的只是用到npm install XX...

45710
来自专栏逆向技术

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 ...

5055
来自专栏Python攻城狮

GitHub 系列之「Git 进阶」1.用户名和邮箱2.alias3.其他配置4.diff5.checkout后面的一长串是commit_id,是每次commit的SHA1值,可以根据 git log

我们知道我们进行的每一次 commit 都会产生一条 log,这条 log 标记了提交人的姓名与邮箱,以便其他人方便的查看与联系提交人,所以我们在进行提交代码的...

862
来自专栏IMWeb前端团队

FIS源码-增量编译与依赖扫描细节

前面已经提到了fis release命令大致的运行流程。本文会进一步讲解增量编译以及依赖扫描的一些细节。 首先,在fis release后加上--watch参数...

26310

扫码关注云+社区

领取腾讯云代金券