“ 数据的价值已经超越了传统企业广泛认同的价值边界,海量数据的存储将是企业所面临的的挑战。HBase正是这种背景下的产物,用以存储海量数据的,支持高并发、高性能、高可用、可伸缩、列存储等特性”

01
—
概述
02
—
架构
rowkey:表的主键,表中的数据按照rowkey字典序排列,类似于MySQL的主键ID;
列族:列族是表的schema的一部分(而列不是),即建表时至少指定一个列族,表中的每个列都归属于某个列族;
列:列肯定是表的某一列族下的一个列,用列族名:列名表示,相当于MySQL中具体的列;
单元格:指定rowkey、列族、列,可以确定一个cell,即单元格,cell中的数据没有类型,是以字节数组进行存储的;
时间戳:可以对表中的cell多次赋值,每次赋值操作时的时间戳,可以看出是cell的版本号,也就是一个cell可以有多个版本的值;


客户端:Client是操作HBase的入口,对于管理表的操作,如表的增、删、改操作,Client通过RPC与HMaster通信完成;对于表数据的读取操作,Client通过RPC与RegionServer交互,完成读取;
Zookeeper集群:
实现了HMaster的高可用,多HMaster间进行主备选举;
保存了HBase的元数据信息meta表,提供了HBase表中region的寻址入口的线索数据;
对HMaster和HRegionServer实现了监控;
HMaster:
HBase集群也是主从架构,HMaster是主的角色
主要负责Table表和Region的相关管理工作
负责新的Region分配到指定的HRegionServer
管理HRegionServer的负载均衡
HRegionServer宕机,负责其上面的Region的迁移
HRegionServer
HBase集群中从的角色,包含多个Region
响应客户端的读写数据请求
Region
HBase集群中分布式存储的最小单元
一个Region对应一个Table表的部分数据
Region包括具体的StoreFile,StoreFile存储在HDFS集群上

Client 与 Zookeeper集群通信,获取meta信息,并且找到对应表的regionserver地址和存储数据的region信息
Client 与 对应的HRegionServer进行通信,确定对应的region
先查询region的memstore,看是否有要查询的数据,找到则返回,没有找到则进入下一步;
再查询blockCache中,是否有要查询的数据,找到则返回,没有找到则进入下一步;
缓存中没有找到数据的话,只能进行磁盘读取,从对应的HFile中读取对应的数据,返回给客户端。
Client 与 Zookeeper集群通信,获取meta信息,并且找到对应表的regionserver地址和存储数据的region信息
Client 与 对应的HRegionServer进行通信,确定对应的region
先把数据预写到HLog中,再写入memstore中;
flush阶段:memstore达到阈值,将memstore中的数据,刷到storeFile(HFile);
compact阶段:经过小合并、大合并,使每个region存储的信息更加紧密,提升查询效率;
split阶段:当每个region过大,反而不利于数据的查询,此时对达到阈值的region进行切分,提升查询效率;
03
—
预分区
当一个table刚被创建的时候,Hbase默认的分配一个region给table。也就是说这个时候,所有的读写请求都会访问到同一个regionServer的同一个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于比较空闲的状态。解决这个问题可以用预分区,在创建table的时候就配置好,生成多个region。
增加预分区的好处:
增加数据读写效率; 负载均衡,防止数据倾斜; 方便集群容灾调度region; 优化Map数量;
每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。我们可以根据业务场景,设定每个表的分区边界,可以保证表中数据分布均匀,更贴近实际业务产生的数据特点。常用方式有手动指定分区和HexStringSplit 算法。
04
—
HBase版本确界和TTL
05
—
HBase的命名空间
配额管理:限制一个namespace可以使用的资源,包括region和table
命名空间安全管理:提供了另一个层面的多租户安全管理
Region服务器组:一个命名或一张表,可以被固定到一组RegionServers上,从而保证了数据隔离性
<table namespace>:<table qualifier>
创建namespacehbase>create_namespace 'nametest'查看namespacehbase>describe_namespace 'nametest'列出所有namespacehbase>list_namespace在namespace下创建表hbase>create 'nametest:testtable', 'fm1'查看namespace下的表hbase>list_namespace_tables 'nametest'删除namespacehbase>drop_namespace 'nametest'
hbase:系统命名空间,包含HBase的元数据表
default:默认命名空间,没有显示指定命名空间的表将会自动放入默认命名空间

06
—
Rowkey设计

1、预分区
2、加盐
3、哈希
4、反转
1、http://hbase.apache.org/book.html
2、《HBase权威指南》




