HBASE

架构
Client
1、HBase shell
2、Java API
HMaster
1、负责表的增删改请求
2、负责给RegionServer分配region
3、负责RegionServer的负载均衡
4、负责发现失效的Region并重新分配
5、负责无用的Region的垃圾回收
RegionServer
1、负责维护region,并处理这些region的IO请求
2、负责切分变大的Region
一个regionserver里有很多个region,一个region有很多个store,一个store中有memstore和N个storefile
Zookeeper
1、保存HMaster的一些元数据,例如:meta表(存储region的一些信息,在那个RegionServer、rowkey的访问)的位置、有哪些表、有哪些命名空间
2、监控RegionServer的状态
3、保证集群在任意时刻只有一个Master

写流程
1、由client发起一个写请求,去Zookeeper中查找meta表所在的RegionServer位置
2、client连接RegionServer所在的节点
3、client从meta表中,根据写入数据的rowkey,找到该数据该写入哪个region中,将数据写入
4、先写hlog,然后再写入memstore
5、当memstore达到默认的128M就会溢写到磁盘形成storefile
+storefile实际上是hdfs上的Hfile文件,写入不需要Master参与

读流程
1、同写入流程一样,首先需要从meta表中根据rowkey获取应该从哪个region中查询数据
2、假设在node1,client会连接node1上的region
3、client去memstore中查找数据,如果有立即返回,没有,则去Hfile中查找,找到之后返回客户端
如果table的in_memory为true,则会将找到的数据放入内存中,以便下一次能直接在内存中直接找到
client为了加快读写请求的相应,会在第一次找到meta表的时候将其位置缓存

WAL机制
HBase在写数据之前,会先写Hlog,然后再写入Memstore
Hlog是kv格式 k:记录了数据写入的信息 v:就是HBase的KeyValue对象,表示HBase中的数据
当RegionServer挂了的时候,在memstore中的数据还未形成storefile,那么这部分数据会丢失,但是可以通过Hlog恢复

表结构
(1)rowkey
(2)列簇
(3)时间戳
(4)cell

特点
1、大:一个表可以有上亿行,上百万列。
2、面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
3、稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4、无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增 加,同一张表中不同的行可以有截然不同的列。
5、数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配, 版本号就是单元格插入时的时间戳。
6、数据类型单一:HBase中的数据都是字节数组,没有类型。

Rowkey
与 NoSQL 数据库一样,Row Key 是用来检索记录的主键。
访问Hbase中table的行
直接通过单个RowKey
指定RowKey的范围
还可以指定跟RowKey有关的正则表达式去访问

列簇
属于表的Schema的一部分,在建表的时候必须指定至少一个Columns Family
HBase中的列归属于某一个列簇
HBase在储存、权限控制、版本控制都是在列簇层面上进行
一个列簇对应一个store

RowKey的设计原则
1)rowkey长度原则
最大64KB,一般10~100字节
2)rowkey散列原则
加盐(加上随机前缀)
在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上。
hash
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。
反转
反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。
StringBuilder有reverse()方法,String无。
时间戳反转
3)rowkey唯一原则
owkey在设计上保证其唯一性。rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块。

RowKey如何设计
1)生成随机数、hash、散列值
2)字符串反转

Phoenix
索引
全局索引
本地索引
覆盖索引
表映射
表映射create table
视图映射 create view
优化
预分区
salt_buckets
二级索引
建立行键与列值的映射关系

热点问题
HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然而糟糕的rowkey设计是热点的源头。 热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。

预分区
一般情况下,创建hbase的时候会自动创建一个region分区,
为了防止大量数据插入一个region,造成热点问题
可以预先创建一些空的region,这样也能提高数据插入的效率

posted @ 2021-08-31 16:52  tonggang_bigdata  阅读(56)  评论(0编辑  收藏  举报