1、基础概述
1、概述
Apache HBase是一个构建在HDFS之上的分布式的、可扩展的、存储大数据数据库。
当你需要基于海量数据随机实时读写操作的时候你可以使用HBase。
HBase的目标是容纳包含数十亿计的行和数百万的列的大表。
它是一个开源的、分布式的、版本化的非关系型数据库,它受谷歌的“BigTable”论文启发而逐渐成型。
2、特点
a、海量数据:一个表可以有数十亿行,上百万列。
b、列式存储:面向列族的存储和权限控制。
c、极易扩展:添加regionserevr节点提高处理能力,添加hdfs节点提高存储能力。
d、稀疏性:可以有任意多的可动态扩展的列,且没有数据的列不占存储空间。
e、多版本:每个列中的数据有多个版本。
f、高并发:高并发情况下单个regionserver节点的延迟并不会有明显的降低。
3.HBase对比RDBMS
热点问题的解决:rowkey的设计
数据量增大自动拆分,RDBMS不行。
4、HBase数据模型
A.行键rowkey:用来检索记录
行键rowkey可以是任意的字符串,最大长度为64kb,按字典顺序存储,在HBase内部保存为字节数组
访问HBase中的数据有三种方式:
a.通过单个rowkey,查询一条数据
b.通过rowkey的范围
c.全表扫描
B.列族column family:
列族在声明时定义,一个列族有多个列,列族是列的集合。
面向列族的存储和权限控制及调优。
同一列族数据存储在同一个目录下,由几个文件保存。
C.存储单元cell:
HBase通过行和列及版本确定的一个cell,{row key,column,version}元祖就是一个cell。
cell中数据以二进制形式存储,没有数据类型。
D.时间戳TimeStamp:
在每一个列中保存了一份数据的多个版本,按时间倒序排序。
在写入数据时,时间戳可以由HBase自动赋值(当前系统时间精确到毫秒),也可以自定义赋值(可能造成数据混乱)。
时间戳对于hbase很重要。
F.命名空间namespace:
相当于MySQL中的database,table从属于命名空间。
常用于管理业务线上的各种表。
2、HBase的架构
Zookeeper:
HMaster的高可用。
HRegionServer的监控并将异常信息发送给HMaster。
存储.meta.表的位置信息(或者说元数据信息)。
HMaster:
为RegionServer分配region,维护整个集群的负载均衡。
RegionServer宕机时负责region和HLog的的迁移。
负责发送切分region和合并storefile合并的命令给从节点。
HRegionServer:
叫RegionServer较多,HBase的从节点,内部有一个或多个region。
处理来自客户端的读写请求,负责与hdfs底层进行交互。
切分region和合并storefile。
HLog(write-ahead logfile):
记录用户对于hbase的写操作。
写操作时,数据并不直接写入磁盘,而要先写入内存,淡到了一定阈值再溢写到磁盘。
但是在内存中中保存数据不安全,数据会先写入Hlog,再写入内存。
所以系统出现故障时,可以通过HLog文件恢复数据。
Region:
region对应于表,初始状态一个表对应一个region。
随着数据的增加,一个region会分裂成两个region,分裂形成的新region在其他RegionServer上。
region是根据rowkey范围横向分裂的,默认当region的一个store达到10GB时,region分裂,分裂点为rowkey的中点。
由hbase.hregion.max.filesize控制。
一个Region有一个或多个store。
store:
store对应列族,初始状态store和列族一一对应,随着region的分裂多个store对应于一个列族。
一个store由零个或多个storefile和一个menstore组成。
Memstore(写缓存):
用户对hbase的操作首先记录HLog中,再写入memstore中,memstore满了128MB(老版本是64MB)才会写到磁盘形成storefile小文件。
StoreFile:
当一个store内storefile小文件的数量超过3个后,系统会进行合并形成更大的全新的storefile文件。
手动合并:
先禁用表:disable 'student'
再启用表:enable 'student'
自动合并:
一个store内storefile小文件的数量达到4个。
HFile:
StoreFile在hdfs上的存储格式。
读写流程
写流程:
1、客户端访问zk,获取meta表位置信息。
2、客户端访问meta表所在节点,获取存储表信息的regionserver节点。
3、客户端访问表所在节点,获取表对应的region及对应的store。
4、往store中写入信息时,先向HLog中写入操作,再向menstore中写数据。
5、数据成功写入menstore,则返回给客户端写入成功的信息。
#### 由于成功写入内存即结束写流程,所以hbase的写入比读取要快。
#### hmaster挂了不影响写入,除非写入造成了region的分裂或storefile的合并,这两个操作都需要hmatser发送指令。
####没有hmaster的指令,region就不分裂,storefile不合并,可能造成数据的倾斜。
#### meta表中存储的是某个范围的rowkey对应数据在哪个节点上这一信息。
所以说,写入操作只要不涉及到region的分裂,就不会更新meta元数据表。
读流程:
1、客户端访问zk,获取meta表位置信息。
2、客户端访问meta表所在节点,获取存储表信息的regionserver节点。
3、客户端访问表信息所在节点,获取表对应的region及对应的store。
4、在store的menstore(写缓冲)中找数据,找不到再去blockcache(读缓存)中找,再找不到则进行
storefile的变量查找。
5、找到了之后会将数据先放到blockcache块中方便下次查找,然后返回数据。
##### hmaster挂了不影响读取数据,在0.98版本前还有一个-root-表 。
##### 一个Regionserver上有一个BlockCache和N个Memstore。
====================================================================================
====================================================================================
====================================================================================
补充flush和storefile合并:
flush流程:
flush操作针对的是当前regionserver的所有memstore,flush操作会阻碍客户端读写。
内存角度:
默认在regionserver内所有store的所有memstore占用当前节点总堆内存的40%触发。
该值由hbase.regionserevr.global.memstore.size控制。
时间角度:
默认当文件在内存中保存3600000毫秒(1h)的时候触发flush。
该值由hbase.regionserevr.optionalcacheflushinterval控制。
单个memstore:
默认单个memstore到达128MB触发flush操作。
该值由hbase.hregion.memstore.flush.size控制。
storefile合并:
默认当一个store内部storefile超过3个的时候,就会触发storefile合并。
由参数hbase.hstore.compactionThreshold控制。
HBase Shell常用操作
0、hbase shell 进入hbase shell客户端
1、help [命令]/version/status/whoami 帮助/版本/集群状态/登录用户
2、list(支持通配符)/desc 所有数据库/表结构
3、create 'default:student','info'.... 建表,不指定命名空间则表建在default下
4、put 'student','1','info:name','zhang3' 插入数据
####如果删除操作给定时间戳晚于插入数据时间戳,则数据不会插入
put '表名', '行键', '列族名:列名', '列值
5、get 'student','1' [,'info:name'] 单行查询/单条查询
get 'student','1',{COLUMN=>'info:name',VERSIONS=>'3'} 单条版本查询
6、scan 'default:student' [,{STARTROW => '1' [,STOPROW => '10']}]
全表扫描[指定起[止]范围],default可以不写,别的命名空间要写,前闭后包
7、delete 'student','1','info:name' 删除一列数据
deleteall 'student','1' 删除一个roowkey的所有数据
8、删除表:disable 'student'/drop 'student' 先禁用,再删除
以上两步骤等价于truncate 'student'
9、count 'student' 返回表记录的条数,即rowkey的数目
10、flush 'default:student' 刷新表数据
#####写数据先写入menstore,只有menstore达到128MB才会溢写形成storefile小文件。
#####手动刷新表数据可以触发溢写。
11、list_namespace/create_namespace 'bigdata' 列出所有命名空间/创建命名空间
12、drop_namespace 'bigdata' 删除命名空间(没有表才可以删除)
13、alter 'student',{NAME=>'info',VERSIONS =>3}设置版本号
======================================================================
[root@Linux005 ~]#hbase hfile -p -f hdfs://Linux005:9000/hbase/data/default/student/a66a069ff35efb353cd6558e9ecafcbd/info/abb651f3c099491fa3b1cf4f851784ef
####查看hbase表文件内容。