简介
概述
- HBase是有Apache提供的基于Hadoop的分布式,可扩展的非关系型数据库
- HBase可以管理很大的数据的表 - billions of rows X millions of columns
- HBase是Doug Cutting根据Google的BigTable来实现,所以HBase和BigTable的原理一模一样,只是BigTable是用C语言实现的,HBase是Java语言实现的
- 本身是非关系型数据库,底层是利用键值对来存储
- 在HBase中也不支持多表关联
- HBase中数据类型只支持字符串和数字
- 适合存储稀疏数据 - 结构化数据和半结构化数据
- 在put的时候表名列族以及行键都一样,再一次put是更新的效果
- hbase作为一个数据库提供了完整的增删改查的功能,但是hbase是基于hdfs来进行存储的,hdfs上的数据是允许一次写入多次读取不允许修改允许追加的,hbase如何实现“改”的功能 - 当执行“改”操作的时候,HBase并不是修改原来的数据,而是在HDFS中存储的文件的尾端来追加数据,每一条数据都会自动添加时间戳,这个时间戳就是版本
- 通过时间戳,每一次默认返回最新的数据
- HBase中的表默认只保留一个版本的数据,也只返回一个版本的数据,如果保留版本,需要建表时需要手动指定
基本概念
- Rowkey - 行键
- 在HBase中没有主键的概念,而是采用行键
- 行键不属于任意列族
- 建表的时候不需要指定行键,行键是在添加数据的时候手动指定
- 默人字典排序
- Column Family - 列族/列族
- 在HBase中,一个表中至少包含一个列族,可以多个列族
- 理论上来说,列族的数量不限定,但一个表一般不超过三个。
- 一个列族中可以包含0到多个列 - HBase,列是可以动态增删的,建表的时候不需要指定列。
- Cell - 单元
- 在HBase中,通过行键+列族+列+版本可以确定唯一数据,这个结构成为cell单元
- namespace - 名称空间
- 类似于mysql中的database
- 默认自带两个名称空间default和hbase
- 如果没有指定默认使用default
基本指令
命令 | 解释 |
status | 查看HBase状态 |
version | 查看hbase的版本 |
whoami | 查看当前用户 |
create ‘person’ ,{NAME =>‘basic’},{NAME => ‘info’},{NAME => ‘other’} | 建表方式 |
List | 查看已经建立的表 |
put ‘person’ ,‘p1’ , ‘basic:name’ ,‘Reason’ | 表示向person表中的basic列族name列添加行键p1的数据Reason |
get ‘person’, ‘p1’, ‘basic:name’ | 获取basic 列族name列的值 |
get ‘person’, ‘p1’, ‘basic’ | 获取basic 列族所有值 |
get ‘person’ , ‘p1’ | 获取行键p1所有的值 |
scan ‘person’ ,{COLUMNS => ‘basic:name’} | 获取basic所有name列的值 |
scan ‘person’ ,{COLUMNS => ‘basic’} | 获取basic列族所有列的值 |
scan ‘person’ | 查看person表中的所有数据 |
delete ‘person’ ,‘p2’ ,‘other:phone’ | 删除行键p2 other列族的phone字段 |
deleteall ‘person’ ,‘p2’ | 删除行键p2的所有数据 |
create ‘student’ , {NAME => ‘basic’ ,VERSIONS =>3} ,{NAME => ‘info’ ,VERSIONS =>5} | 创建一个student表有basic 和info两个列族,basic保留三个版本,info保留5个版本 |
get ‘student’,‘s1’ ,{COLUMN =>‘basic:age’,VERSIONS => 4} | 查询student表列族为basic age字段的4个版本的值,但建表的时候指定三个版本,只能拿到最新的三个版本的值 |
disable ‘student’ | 先禁用表 |
drop ‘student’ | 再删除表 |
describe ‘person’ or desc ‘person’ | 描述person表的信息 |
enable ‘person’ | 启用person表 |
exits ‘person’ | 判断person表是否存在 |
create ‘demo:person’ ,‘basic’ ,‘expand’ | 在指定工作空间demo下创建person |
list_namespace_tables ‘demo’ | 查看指定名称空间的表 |
list_namespace | 查看所有的名称空间 |
create namespace ‘demo’ | 创建名称空间demo |
disable_all ‘demo:.*’ | 禁用demo空间下所有的表 |
drop_all ‘demo:.*’ | 删除demo中所有的表 |
drop_namespace ‘demo’ | 删除工作空间demo |
理论
HRegion
- 在HBase,会从行键方向上将一个表拆分成一个或者多个HRegion
- 每一个HRegion都会交会交由某一个HRegionServer来进行管理
- 由于行键是字典排序,所以HRegion之间的范围是不交叉的,也因此客户端在请求的时候会根据行键去访问不同的HRegionServer
- HRegion实际上是行键排序(默认是字典排序)后的按规则分割的连续的存储空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwoq1mNO-1626053727764)(/Users/yuxiangrui/blog/source/picture/截屏2020-04-27下午5.35.27.png)]
- 一张Hbase表,可能有多个HRegion,每个HRegion达到一定大小(默认是10GB)时,进行分裂。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6N3eTgEv-1626053727766)(/Users/yuxiangrui/blog/source/picture/截屏2020-04-27下午5.37.21.png)] - HRegion包含了一个到多个HStore,HStore的数量由列族来决定
- HStore中包含一个1个memStore可能包含0个或多个storefile/hfile,hfile会落地到HDFS上进行存储
Zookeeper
- 当HBase第一次启动的时候,会在Zookeeper上注册一个持久节点
- 当HBase启动时候,HMaster会自动在zookeeper来注册一个/hbase/master节点
- Backup HMaster会自动在Zookeeper的/hbase/backup-masters下自动注册临时节点
- zookeeper在HBase中的作用注册中心的作用/统一注册
HMaster
- HMaster的状态分为:Active(活跃)和Backup(备份)
- 在任意一个安装了HBase去启动hmaster,sh hbase-daemon.sh start master
- 在HBase中不限制Hmaster 的个数,先开启的HMaster会自动成为active状态,后开启的为backup状态
- 当Active HMaster收到请求之后需要将这个请求和Backup HMaster之间进行备份,也因此在实际开发过程中Hamster的个数一般不超过三个1active Hmaster +2 backup hmaster
- Active HMaster会定时给Zookeeper发送心跳,同时监控/hbase/backup-masters下的子节点个数变化,如果发现/hbase/backup-masters下的字节点个数增加说明新增了Backup Hmaster;反之说明有节点产生丢失
- backup hmaster会定时给zookeeper发送心跳,同时监控/hbase/master节点是否存在,如果不存在意味着Active HMaster丢失
- HMaster的作用
- 管理HRegionServer,主要是HRegion在HRegionServer之间的负载和转移
- 管理HBase中的表结构(DDL操作),但是HMaster不负责表数据(DML操作)的管理
集群结构角度的读写流程
- 在HBase0.96之前
- 从HBase0.96开始
- 去掉了-ROOT- 文件
- 客户端从zookeeper中获取.meta.文件的位置之后会自动进行缓存,从第二次操作开始,就不需要再去访问zookeeper
- 客户端从.meta.文件中读取数据之后也会自动进行缓存,但是如果发生了HRegion的分裂转移或者客户端宕机,那么缓存就会失效就需要重新建立缓存
HBase命令组
- DDL(Data Definition Language)数据库模式定义语言, 是用于描述数据库中要存储的现实世界实体的语言。
- DML(Data Manipulation Language)数据操纵语言,用户通过它可以实现对数据库的基本操作。
HRegionServer
- HRegionServer是HBase中的从节点,作用是用于管理HRegion,HRegion中的数据最终会以HFile形式存储到datanode
- 官方文档中,一个HRegionServer大概能管理1000个HRegion
- 一个HRegionServer由1个WAL(HLog)、1个BlockCache和0到多个HRegion来构成
WAL
- WAL - write ahead log 也称 Hlog
- HRegionServer在收到写操作之后,会先将这个写操作记录到WAL中,然后再将数据更新到对应的memStore中,这样的设计是为了防止数据的丢失
- WAL是维系在磁盘中,当达到指定条件的时候,WAL就会产生滚动,产生一个新的WAL,原来的WAl会变成OLD_WAL,OLD_WAL会在某一时刻被清除,这样做的目的是为了节省磁盘空间
- 在HBase0.94版本之前,WAL是串行写;从HBase0.94版本开始,WAL引入了管道机制,所以允许进行并行写
- 在实际开发过程中,如果能够容忍一定的数据库的数据产生丢失,可以关闭WAL提高写入效率
BlockCache - (数据块)缓存
- BlockCache是一个读缓存,即会讲读取出来的数据进行缓存
- BlockCache在进行数据缓存的时候,采取了“局部性”原理 —— “局部性”原理:实际就是一个猜测的过程,根据一定条件猜测来提高命中率
- 时间局部性:在HBase中,如果一条数据被读取过,那么HBase就会把这条数据放入缓存
- 空间局部性:在HBase中,如果一条数据被读取过,那么HBase会把与这条数据相邻的数据发入缓存中
- BlockCache会将数据维系在内存中,BlockCache大小是128M
- BlockCache在填满之后,采取LRU策略(Least recently used)抛弃最长时间不用的数据
HRegion
- HRegion由一个到HStore来构成的 ,HStore的数量由列族的数量来决定
- 每一个HStore中包含一个memStore以及0到多个HFile
- memStore是一个写缓存,维系在内存中,大小是128M
- memStore在达到指定条件之后,会产生冲刷,冲刷出一个HFile,HFile最终会落地到HDFS上
- memStore冲刷条件:
a) 当memStore满了之后,会冲刷产生一个HFile
b)当我的WAL达到1G大小的时候,会冲刷产生一个HFile
c) 当所有的memStore所占用的内存之和占到总内存的35%的时候,就会自动冲刷几个比较大的memstore - 第三个条件在实际开发过程中产生的频率最高,这会使HDFS产生大量的小文件
Compaction机制
- HBase中提供了Compaction机制,允许将多个HFile合并成一个HFile
- 分类:
- minor compact :初次合并,在合并的时候,会讲相邻的几个小的HFile合并成一个较大的HFile不合并,合并完成之后依然存在多个HFile
- major compact :主合并,在合并的时候。HFile无论多大,都会参与合并,最终会合并成一个HFile
- 在HBase中,如果不指定的情况下,默认使用minor compact
- 相对而言,minor compact 的效率更高一些,major compact虽然合并力度更大,但是在实际开发中,每次进行major compact都需要花费5-6个小时,在合并过程中,集群的大量资源(I/O、cpu等)倾斜到合并上,所以此时集群对外服务的效率会大大降低,所以major compact一般放在周末的凌晨进行
- 在合并的过程中,舍弃掉被标记为删除数据或者过时的数据,所以删除是在合并的过程中发生的
读写流程
写流程
- 当HRegionServer在收到写请求之后,会将写请求记录到到WAl中,会将数据更新到memStore中
- 数据在memStore中会进行排序:行键字典排序—>列族字典排序->列字典排序->时间戳倒序
- 当memStore达到冲刷条件的时候,会冲刷产生一个新的HFile,这个HFile是有序的 - 所有的HFile之间是局部有序的
- 正因为HFile是有序的,所以每一个HFile都把持了各自的起始行键和结束行键
- HFile最终会落地到HDFS中以block形式存储
HFile的v1格式
- DataBlock:存储数据,可以一个可以多个
- 包含一个magic和多个key value
- magic: 魔数 本质上一个随机数,用于校验的
- KeyValue:DataBlock中存储的数据都是以键值对
- 最小存储单位datablock
- MetaBlock:存储元数据,一般只出现在.meta.文件中,其他的HFile中的一般没有这一块
- FileInfo: 文件信息,对当前HFile的描述,例如文件大小信息
- DataIndex:DataBlock的索引值,记录每一个DataBlock在文件中的起始字节和结束字节位置
- MetaIndex:MetaBlock的索引值,记录每一个MetaBlock在文件中的起始字节和结束字节位置
- Trailer:在文件末尾,固定占4个字节大小,其中前2个字节记录DataIndex在文件的起始字节位置,后2个字节记录MetaIndex在文件的起始字节位置
读流程
- 当HRegionServer收到请求之后,会首先从blockcahe中读取数据,如果没有读到,会从memstore中读
- 如果以上都没有读到,就会从HFile中读,会根据行键范围删选掉不符合范围的Hfile,再利用布隆过滤器筛选出一定没有的,缩小范围。