设为首页 加入收藏

TOP

Hbase数据模型与存储结构
2019-01-05 01:46:52 】 浏览:26
Tags:Hbase 数据 模型 存储 结构
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzxlfly/article/details/82229511

一、Hbase简介

Hbase是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。依托Hadoop-HDFS作为其文件存储系统,利用MapReduce来处理海量数据,用Zookeeper作为其分布式协同服务,主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)。

二、 Hbase数据模型

1、存储模型分布

下边表示了一行,三列的数据,CF1、CF2、CF3是三个不同的列族,在t2时刻CF1下存入列名为q1,值为q2,rowkey为11248112;在t6时刻CF2、CF3下分别存入列名为q2,q3,值为q2,q3,rowkey为11248112;t3时刻没有存入 。和关系数据库不同这里的空白处是不占用空间的。

Row Key

Time Stamp

CF1 CF2 CF3
11248112 t6

CF2:q2=v2

CF3:q3=val3

t3
t2 CF1:q1=v1

2、单元格(cell)

(1)cell由行和列的坐标交叉决定;

(2)单元格是有版本的;

(3)cell的内容是未解析的字节数组;

(4)cell由{row key column( =<family> +<qualifier>) version} 唯一确定的单元

(5)cell中的数据是没有类型的,全部是字节码形式存贮。

3、RowKey

(1)决定一行数据,按行检索数据,相当于一级索引

(2) 按照字典顺序排序的,说明数据是有序的

(3)只能存储64k的字节数据,RowKey越短越好

4、列族(Column Family

(1)HBase表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先给出。如 create ‘tb’, ‘f’;

列名以列族作为前缀,每个“列族”都可以有多个列(column);如f:a, f:b, 新的列族成员(列)可以随后按需、动态加入

(2)权限控制、存储以及调优都是在列族层面进行的

(3)HBase把同一列族里面的数据存储在同一目录下,由几个文件保存

5、时间戳(Timestamp)

(1)在HBase每个cell存储单元对同一份数据可以有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

(2)时间戳的类型是 64位整型,一般由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间

时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳

三、hbase架构

1、Client

提供了访问HBase的一系列API接口,如Java Native API、Rest风格http API、Thrift API、scala等,并维护cache来加快对HBase的访问

2、Zookeeper

(1)保证任何时候,集群中只有一个master

(2)存贮所有Region的寻址入口

(3)实时监控Region server的上线和下线信息,并实时通知Master

(4)存储HBase的schema和table元数据

如下:replication下存副本节点信息,meta-region-server存region server元数据信息,rs下regionserver节点信息,backup-masters存backup-masters节点信息,不在详细说明,顾名思义。

[zk: localhost:2181(CONNECTED) 11] ls /hbase
[replication, meta-region-server, rs, splitWAL, backup-masters, table-lock, flush-table-proc, region-in-transition, online-snapshot, master, running, recovering-regions, draining, namespace, hbaseid, table]

3、Master

(1)为Region server分配region

(2)负责Region server的负载均衡

(3)发现失效的RegionServer并重新分配其上的region

(4)管理用户对table的增删改操作

4、RegionServer

(1)Region server维护region,处理对这些region的IO请求,向HDFS文件系统中读写数据

一个RegionServer由多个region组成,一个region由多个store组成,一个store对应一个CF(列族),而一个store包括位于内存中的memstore和位于磁盘的storefile,每个storefile以HFile格式保存在HDFS上。写操作先写入memstore,当memstore中的数据达到某个阈值时,RegionServer会启动flashcache进程写入storefile,每次写入形成单独的一个storefile。

(2)Region server负责切分在运行过程中变得过大的region

每个表一开始只有一个region,随着表数据不断插入,数据越来越多,storefile也越来越大,当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),minor主要是合并一些小的文件,不做删除,清理操作,而majar在合并过程中会进行版本合并和删除工作,形成更大的storefile。

当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个新的region(裂变),每个region保存一段连续的数据片段,如此往复,就会有越来越多的region,并由Master分配到相应的RegionServer服务器,这样一张完整的表被保存在多个Regionserver 上,实现负载均衡。

5、Region

HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的 HRegion server上

HRegion由一个或者多个Store组成,每个store保存一个columns family。每个Strore又由一个memStore和0至多个StoreFile组成,每个storefile以HFile格式保存在HDFS上,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile,如下图。

6、HLog(Write Ahead Log)

在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复

HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的Key、Value

参考:http://abloz.com/hbase/book.html#conceptual.view

参考:http://hbase.apache.org/1.2/book.html#datamodel


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hbase   snapshot 下一篇Hbase架构   Hbase Region的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }