列存储库Hbase入门基础
接触hbase几个月,都没能梳理梳理,今天又重新回顾梳理一番。
首先Hbase是一个NoSql的数据库。其特点可以存储松散数据类型,其存储的数据类型可以近似认为是一种关系映射(但又不是简单的映射),所以有人说hbase是多个多级的hashmap组成。它还可以动态的改变表的结构,增加列、保留版本等。
关键词
首先我们要知道hbase的专有名词
CF(Column Family)
也叫做列族,一个列族中可以有多个列,且这些列可以动态的添加。
其结构类似于{name=>'zhangsan',age=>'12',sex=>'man',timestamp=1543319294288},前面的key也叫做Qualifier,后面是key所对应的值。timestamp是时间戳,一般默认每个单元格有3个时间戳的版本数据,这个值一般是系统自动生成,对于相同Qualifier的数据会保存三个版本。
key-row
key-row作为CF的'key'值,每一个key-row都对应着表中每个CF。
master
Hbase Master(HMaster)的作用主要是对HRegion的维护,管理用户对表的CRUD操作。
其维护工作主要包括:
- 管理HRegion服务器的负载均衡,并调整HRegion位置
- HRegion分裂之后重新分配
- 在HRegion服务器怠机后,把该服务器上的HRegion重分配
HRegion
当表超过了设置值时,Hbase会将表横向划分为不同的区域。在物理存储上来说,每个区域就是一个HRegion。一个HRegion会保存一段连续的数据。其数据范围是(开始key-row->结束key-row)
HRegion Server
一般一台机器运行一个HRegion Server。Server包括了存储部分和日志部分。
对于储存部分,一个HRegion Server来说,可以存储多个HRegion。每个HRegion中有一个MemStore和多个StoreFile(Hfile)。memStore是一个内存的实体,当数据写入时如果超过了这个内存的大小,会倾斜到具体的Hfile中。
zookeeper
大多数分布式数据库都依赖zookeeper来实现HA。Hbase也不例外。zookeeper是来协调各个机器的关系的,在hbase中zk会去协调HBase Master和Hbase Server的关系,保障了只有一个Master处于运行状态,并负责Server的注册。在zookerper端会储存一张ROOT表和META表,每个ROOT表存储的是每个元数据相对应的多个HRegion,META表对应的是每个HRegion对应的server。所以用户请求到来时会先到zk,zk会找到想对应的server。
图片.png数据模型
- Hbase是一个底层基于HDFS文件系统的数据库。其特点是基于列储存,每一列族由1个或几个文件保存,不同的列族- 文件是分离的。
- 在Hbase中的数据类型只有字符串没有其他类型。
- 列名字的格式是<family>:<qualifier>,family创建后是固定的(一张表有一个列族集合),而后者quelifier是可变的
- Hbase把同一个列族里面的数据存储到同一目录下,并且Hbase的写操作是锁行的。
- Hbase每次更新都有一个时间戳,每个更新都是一个新的版本,Hbase默认保留3个版本。我们可以同时获得3个版本的数据。
设计规则
因为Hbase本身的效率很大部分取决于使用者的设计。所以概括一下应该有的设计规则
-
row-key的设计
确定需要存储数据需要用什么方式设计行键,是时间顺序还是数据的本身顺序还是乱序。
使用不同的顺序,每个HRegion中的数据也会不同。
如果采用时序,那么HRegion中数据都是根据时间连续的。那么找到相同时间的某些数据效率很高。
如果按照数据本身排序,那么数据将会连续。那么查询某一范围内的数据会高效。
如果是乱序,可保证负载均衡。效率会降低。 -
列族的设计
列族我们应该做到的尽可能的少。因为在同一个表中,如果有多个列族,且数据不均匀,很容易导致效率地下。
如cf1有数据1亿条,cf2有100条,当HRegion分裂成多个后,cf1保持着每个HRegion多条数据,但是cf2却分散得很开。这样进行查询会造成效率低下。 -
尽量减少行列大小
因为每个具体的值都是可以按索引查找,这样可以增加效率。索引一般是按照 行键、列族:列、时间戳、值进行的。如果行键和列过于庞大,效率自然就低了。