HBase数据字典
数据字典用来存储了系统的元数据。HBase的元数据包括:用户表的定义、表的切分方案、分片的分布情况(即分片分布在哪个regionserver上)、分片对应的数据文件和日志文件。其中,分片和数据文件的映射关系是通过目录映射实现的,即不同的分片的数据文件存储在不同的目录中,其中目录的名称是分片的名称。【对比:在Hypertable中分片与数据文件的映射关系记录在表中】
如图3-13所示。HBase使用表-ROOT-和表.META存储元数据【Oracle也用表存储元数据】。和普通的表一样,这两张表对应的分片分布在RegionServer上的。.META.存储了所有用户表的元数据库,可以被分裂,其元数据存储在表-ROOT-中。-ROOT-有且只有一个分片,不能被分裂。ZooKeeper的节点ZK/hbase/root-region-server存储了加载-ROOT-分片的RegionServer的地址信息,是整个系统的入口。
注:在本文描述的HBase0.90.0中,.META.还不支持分裂,不过最新版本已经支持分裂.META.了。

图3-13 定位分片的层次
1 表.META.
表.META.的定义脚本如下:
create '.META.', {NAME => 'info', VERSIONS => 10, COMPRESSION => 'none',IN_MEMORY => true, BLOCKCACHE => true, BLOCKSIZE =>8096,TTL
=> 2147483647, BLOOMFILTER => 'NONE', REPLICATION_SCOPE => 0 }
|
family |
qualifer |
描述 |
|
info |
regioninfo |
分片的属性信息,包括startkey,endkey,对应表的定义等 |
|
server |
加载本分片的RS地址信息 |
|
|
serverstartcode |
加载本分片的RS的启动时间,用于MasterServer区分RS是否重启 |
|
|
splitA |
子分片A的regioninfo |
|
|
splitB |
子分片B的regioninfo |
表3-1 .META.的定义
.META.的rowKey是分片的名称。regionname的格式如表3-2.
|
分片类型 |
分片名称的格式 |
|
-ROOT- |
tablename+','+startkey+','+regionid 规定-ROOT-分片的regionid为0,所以名称为: "-ROOT-,,0" |
|
.META. |
tablename+','+startkey+','+regionid 0.90.3版本不支持.META.分裂,规定.META.分片的regionid为1所以名称为: ".META.,,1" |
|
普通分片 |
tablename+','+startkey+','+regionid+'.'+md5+'.'其中md5是tablename+','+startkey+','+regionid的md5码 |
表3-2 分片名称的格式
分片名称中存在regionid的原因?
父分片分裂后,由于垃圾回收机制的需要,父分片的元数据不能立即在.META.得到删除,所以父分片和子分片的元数据会同时出现在.META.中。但是第一个子分片与父分片的tablename和startkey都一样, tablename+startkey无法唯一标识一个分片,所以在分片名称的尾部增加了一个regionid,从而使得分片名称可以唯一标记一个分片。regionid实际是分片的生成时间,子分片的regionid一定要比父分片的regionid要大。
regioninfo的定义参见下图。

图3-14 序列化的regioninfo
|
字段 |
描述 |
|
version |
版本号。为0 |
|
endkey |
|
|
offLine |
用于分裂。true表示已经closed,但是还不能删除,因为其数据文件还在被子分片使用 |
|
regionId |
分片创建当前时间 |
|
regionName |
见表3-2 |
|
split |
true:本分片已经被split。 |
|
startKey |
|
|
tableDesc |
见表3-4 |
|
hashCode |
前面所有字段的hash值 |
表3-3 regioninfo的各个字段的定义
|
字段 |
描述 |
|
version |
5 |
|
name |
表名 |
|
isRoot |
是否是表-ROOT- ,冗余信息? |
|
isMeta |
是否是表.META. ,冗余信息? |
|
tableAttrNum |
字段tableAttrList中表属性的个数 |
|
tableAttrList |
见表3-5 |
|
familyListNum |
列族的数量 |
|
familyList |
见表3-6 |
表3-4 tableDesc的定义
|
名称 |
描述 |
默认值 |
|
FAMILIES |
未使用? |
|
|
IS_ROOT |
是否是表"-ROOT-" |
|
|
IS_META |
是否是表".META." |
|
|
READONLY |
表的状态 |
false |
|
DEFERRED_LOG_FLUSH |
若为true。写数据时,无需确认WAL是否写入磁盘,即可返回。以数据的持久性交换写性能。 |
false |
|
MAX_FILESIZE |
分片所有数据文件的总大小达到这个阀值后,需要分裂分片。单位是字节。 |
256M |
|
MEMSTORE_FLUSHSIZE |
当分片的所有MemStore的总大小到达这个阀值后,需要把MemStore中的数据写入磁盘数据文件。单位是字节。 |
64M |
表3-5 tableAttrList
|
名称 |
描述 |
默认值 |
|
NAME |
列族名称 |
无 |
|
VERSIONS |
最大版本数 |
3 |
|
TTL |
time to live |
Integer.MAX_VALUE,表示永久有效 |
|
IN_MEMORY |
是否常驻内存 |
false |
|
COMPRESSION |
列族的压缩算法 包括 "lzo" "gz" "none" |
"none" |
|
COMPRESSION_COMPACT |
major时的压缩算法 |
同COMPRESSION |
|
BLOOMFILTER |
"NONE" "ROW" "ROWCOL" |
"NONE" |
|
REPLICATION_SCOPE |
多个数据中心备份数据的参数。【待研究】 |
0 |
|
BLOCKSIZE |
StoreFile的 data block大小, 单位字节 |
64*1024 |
|
BLOCKCACHE |
是否缓存其block |
true |
表3-6 familyAttrList
2 表-ROOT-
表-ROOT-存储了表的.META.的元数据,并且不可以分裂。创建-ROOT-表的脚本如下:
create '-ROOT-', {NAME => 'info', VERSIONS => 10, COMPRESSION => 'none', IN_MEMORY => true, BLOCKCACHE => true, BLOCKSIZE =>8096,TTL => 2147483647, BLOOMFILTER => 'NONE', REPLICATION_SCOPE
=> 0 }
3 系统入口
从某种程度上来说,zookeeper是一个小型文件系统,可以用来存储及少量的数据。ZK/hbase/root-region-server是zookeeper中的一个文件,用来存储了加载-ROOT-分片的RegionServer的地址信息(主机名+port),是HBase集群的总入口。
HBase数据字典的更多相关文章
- hbase基本结构
HBASE 基本结构一.overview1. hbase <=> NOSQL 不错,hbase 就是某种类型的nosql 数据库,唯一的区别就是他支持海量的数据. hbas ...
- HBase replication
Hbase Replication 介绍 现状 Hbase 的replication目前在业界使用并不多见,原因有很多方面,比如说HDFS目前已经有多份备份在某种程度上帮助HBASE底层数据的安全性, ...
- HBase的replication原理及部署
一.hbase replication原理 hbase 的复制方式是 master-push 方式,即主集群推的方式,主要是因为每个rs都有自己的WAL. 一个master集群可以复制给多个从集群,复 ...
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Hbase的伪分布式安装
Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- Spark读写Hbase的二种方式对比
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...
- 深入学习HBase架构原理
HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...
随机推荐
- Universal-Image-Loader 图片异步加载类库的使用
这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...
- UNIX网络编程——揭开网络编程常见API的面纱【下】
Linux网络编程数据收发的API流程分析 只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了.在网络编程章节的数据接收过程中,我们主要介绍过read ...
- Android-MVVM架构-Data Binding的使用
项目整体效果: Awesome-Android-MVVM 什么是MVVM, 为什么需要 MVVM? 如何在Android中使用Data Binding实现MVVM架构? 什么是MVVM , 为什么需要 ...
- 带你深入理解STL之Stack和Queue
上一篇博客,带你深入理解STL之Deque容器中详细介绍了deque容器的源码实现方式.结合前面介绍的两个容器vector和list,在使用的过程中,我们确实要知道在什么情况下需要选择恰当的容器来满足 ...
- Android初级教程:shape的基本用法
转载本文请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203347 点击打开链接 在自定义进度条之前,先来学习一下shape的用 ...
- 【Android应用开发】EasyDialog 源码解析
示例源码下载 : http://download.csdn.net/detail/han1202012/9115227 EasyDialog 简介 : -- 作用 : 用于在界面进行一些介绍, 说明; ...
- android程序崩溃后重启
有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决了该问 ...
- MySQL输入密码后闪退,这里有解
不知道怎么的,我的MySQL就像抽风了一样,可能是不想理我了吧.只要我输入密码,它就会闪退.而且使用其他的数据库管理工具也是链接不成功的.于是下决心,调教调教它,于是有了下面的这些解决方案. 解决方法 ...
- 尚学堂马士兵struts2 课堂笔记(二)
14通配符问题 其实这个问题看一个例子就ok <package name="actions" extends="struts-default" names ...
- C++ Primer 有感(命名空间)
1.命名空间定义以关键字namespace开始,后接命名空间的名字. 2.命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义. 3.定义在命名空间中的实体称为命名空间的成员.像任意 ...