如果HBase集群之间的时间差超过30s,则会导致regionServer无法启动
删除表必须先diable表
删除namespace必须先清空ns内的表
修改数据会增加一行,并带时间搓,查询的时候,取最大时间戳那条
删除会增加一行,并带时间戳,并标记为删除
如果修改或者删除时候带的时间错比最大的小,会导致修改无效
表可以指定版本,查询的时候带版本可以获取一个列的多个版本的数据,表示表可以为每条记录保留的版本数
内存达到一定阈值则开始刷写,但是不阻塞,达到阈值的上线,则阻塞客户端写操作,并直到刷写完毕,
触发刷写的条件
https://pan.baidu.com/s/1IcipwNjDDJqYWXvjatKumw#list/path=%2F
27gx
定义
HBase是一个分布式,可扩展,支持海量数据存储的NoSql数据库
数据模型
逻辑上,它跟关系型数据库类似,数据存放在一张表中,有行有列。但实际在底层物理存储结果,是以K-V来存的
逻辑结构
hbase-struct- 一张表由列族/列/rowkey组成
- 不同的列族存放在不同的hdfs文件中
- 根据配置的大小,表会按照rowkey水平切分为不同的region存放在不同的hdfs文件中
- 列和value是表的数据,初始建表不需要指定列名
物理结构
hbase-store- 数据会存放到hdfs上
- 每一行的每个列是在hdsf中式一行或者多行数据(历史数据)
- 每一行中的每一列都有一个时间戳,在获取此cell数据时,会取时间戳最大的那个value
- 如果cell被删除,那么也会往hdfs上新增一条数据,并标记为删除
- 如果同一个cell含有多个行,会在major merge时把多行合并成一行
术语
Name Space
命名空间,类似于数据库名,hbase自带两个命名空间,hbase和default,hbase存放内置的表,default为用户默认使用的命名空间
Region
可以理解为以水平切割的一个分表,是按rowkey切分的一个表,初始时只有一个region,当大小达到阈值,会切分成多个region,用于加快检索速度
Row
表中每行都有一个rowkey,一个row有多个col,hdfs以rowkey的字典序存储,查询数据是必须用rowkey来定位数据。
Column Famliy
列族可以理解为以垂直切分的一个分表,需要在建表时指定,官方推荐使用每个表只使用一个列族,这样可以减少小文件的出现,例如每个列族的大小相差很大的时候,会出现有些列族的文件大,而某些列族的文件非常小
Column
列可以动态变化,每行可以拥有不同的col,不需要指定,它属于表中的数据
Time Stamp
代表每行数据的插入时间,hbase使用它来做版本控制,但同一个col有多行数据时,取时间戳最大的那一行,时间戳可以在客户端发put命令时指定,如果此时客户端指定的时间戳小于hbase的那行数据的时间,则会导致更新无效
Cell
是一行里面对应col的数据,没有类型,以字节方式存储,获取和写入时,需要序列和反序列化
架构图
hbase-overviewclient
client通过hbase的接口访问Hbase,client会缓存集群的元素据来加速访问,元数据的信息有regionserver在集群对应表和ip的信息
Zookeeper
- HMaster通过ZK来选举产生,提供HMaster的高可用
- 监控RegionServer的状态,当RS出现异常,通知HMaster以方便HMaster进行RS的重新分配调度
- 提供元数据的统一入口,元数据也是存放在HDFS上的
HMaster
- 为RS分配Region
- 负责整个集群的负载均衡
- 通过操作ZK,维护集群的元数据
- 当Region失效,则将失效的Region分配到正常的RS上
- 当RS失效,则协调对应的HLog进行拆分
- 进行DDL的操作
- 不负责DML的操作
HRegionServer
- 处理DML
- 管理多个Region
- 负责与HDFS的交互
- 负责Region的拆分和StoreFile的合并
- 维护HLog
HDFS
- 存储HLog/WAL
- 存储元数据
- 存储表数据
- 提供分布式存储,多副本,保证高可用
HLog
修改记录时,HBase并不是直接写入HDFS和磁盘,而是先追加到HLog,然后写入内存,在配置时间内再刷写到磁盘,如果这中间机器出现故障,可以通过HLog恢复
Store
Region中的Stroe代表一个列族一个Store
MemStore
内存存储,用于保存最近的数据操作
HFIle
HBase的物理存储文件,并存放在HDFS上
写流程
hbase-write- client问ZK meta的RS位置
- client连接RS获取meta表并缓存
- client查询根据rowkey,region,colFamily查询meta表获取RS位置
- client向RS写入数据
- RS写入HLog并更新memstore,然后返回
- 在后面一定时间内,RS写入磁盘并同步到HDFS
读流程
hbase-read- client向ZK请求meta的RS
- client向RS请求meta
- 根据rowkey找到RS
- 向RS请求du
- RS获取内存数据,磁盘数据和HDFS的数据,并做合并,最终把结果返回client
Flush
每次在客户端输入Flush ‘tableName’都会在HDFS生成一个文件,内容为memstore合并后的内容
如果RegionServer memstore的内存使用达到配置内存的上限,则会阻塞写操作,直到刷写完到磁盘,其他情况的刷写,不会阻塞写操作
触发条件
- 整个RegionServer的内存达到regionserver的下限
- 整个RS在一定时间内无写操作
- 某个RS的memstroe大小达到配置的大小
- 当hlog的个数达到上限,一个hlog的大小为128m或配置值
Region合并
由于某些Region删除了大量的数据,导致Region内的HFile过小,那么此时就有必要通过合并Region来减少小文件
冷合并
前提时HMaster和HRegionServer都停掉,否则会报错,不适用于生产环境
hbase org.apache.hadoop.hbase.util.Merge table_name\
table_name,a,147608089478.39erijidsfd8s098fen32j3i8d9. \
table_name,b,148893879502.48jfidnxoskd023843257822j3i.
热合并
不需要停机
merge_region '39erijidsfd8s098fen32j3i8d9','48jfidnxoskd023843257822j3i'
HFile Compaction
由于每次Flush都会从memstroe产生一个HFile,时间长了,会导致HDFS上出现很多小文件,此时有可能同一个cell会有多个版本出现在不同的HFile中,如果此时查询就需要遍历所有的Hfile才可以找到对应的rowkey,所以为了清理过期和删除的数据,就需要进行对HFile合并
Minor Compaction
会把若干个小文件单纯的合并成一个文件,而不会清理过期和删除的数据
Major Compaction
会把Store下的所有HFile合并成一个大HFile,并清理过期和删除数据
触发条件
- HFIle超过阈值的最小值,一次最多合并配置的最大值,会触发Minor compact
- 当HFIle超过配置的最大数,会阻塞客户端写
- 当Major Compaction的最大周期到达,会做全量合并,建议设置为0,手工触发,在低峰时候执行
- 当HFile文件数超过阈值,会触发Major Compaction
Region Split
当1个Region的某个store下所有的StoreFile的总大小超过min(R^2*memstore.size,maxSize),会进行split,R为当前table的个数
可以看出这有可能越往后切割的文件会越来越大,直到到达10G。
DDL&DML
进入命令行
Hbase shell
查看有哪些表
list
建表
create 'tableName' 'colFamilyName'
插入/更新数据
put 'tableName','rowkey','colFaimilyName:colName','value'
查看所有记录
scan 'tableName'
scan 'tableName', {startrow=>'rowkey', stoprow=>'rowkey'}
查看表结构
describe 'tableName'
查看某行
get 'tableName','rowKey'
get 'tableName','rowKey','colFamily:col'
表行数
count 'tableName'
删除某rowkey的全部数据
deleteall 'tableName','rowkey'
删除某列
delete 'tableName','rowkey','colFamily:col'
清空表
disable 'tableName'
truncate 'tableName'
删除表
disable 'tableName'
drop 'tableName'
改变表存放的版本数
alter 'tableName',{NAME=>'colFamily',versions=>3}
get 'tableName','rowKey',{column=>'colFamily:col',versions=>3}
网友评论