Hbase核心知识点

Hbase角色

HMaster
功能:
1-监控RegionServer;
2-处理RegionServer故障转移;
3-处理元数据的变更;
4-处理region的分配和移除;
5-在空闲时间进行数据的负载均衡;
6-通过Zookeeper发布自己的位置给客户端

RegionServer
功能:
1-负责存储Hbase的实际数据;
2-处理分配给它的Region
3-刷新缓存到HDFS;
4-维护HLog;
5-执行压缩;
6-负责处理Region分片;

组件:
1-Write-Ahead logs
Hbase的修改记录,当对Habse读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有跟高的概率引起数据丢失,为了解决这个问题,数据会先写入一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以系统出现故障的时候,数据可以通过这个日志文件重建。
2-HFile
这是再磁盘上保存原始数据的实际的物理文件,是实际的存储文件
3-Store
HFile存储再Store中,一个Store对应Hbase表中的一个列族;
4-MemStore
内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存再WAL中之后,RegionServer会在内存中存储键值对;
5-Region
Hbase表的分片,Hbase表会很具RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个Region。

Hbase架构

一个RegionServer可以包含多个HRegion,每个RegionServer维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DataNode数量一致,请参考如下架构图:
在这里插入图片描述
Hbase读写流程
Hbase读流程
1-Client访问Zookeeper,从Zookeeper中获取-ROOT-表所在位置,进而找到.META.表所在的位置信息(即找到这个.META.表在那个HRegionServer上保存着)。
2-Client通过第一步中获取的ip访问.META.表所在的HRegionServer,从而读取到.META.,获取.META.表中存放的元数据。
3-Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描HRegionServer的Memstore和StoreFile来查询数据;
4-最后HRgionServer把查询到的数据响应给Client;

Hbase写数据流程
1-Client首先访问zookeeper,找到-ROOT-表,进而找到.META.表,并获取.META.表信息。
2-确定当前将要写入的数据所对应的RegionServer服务器和Region;
3-Client向该RegionServer服务器发起写入数据请求,然后RegionServer收到请求并响应;
4-Client先把数据写入到HLog,以防止数据丢失;
5-然后将数据写入到Memstore;
6-如果HLog和Memstore均写入成功,则这条数据写入成功。在此过程中,如果Memstore达到阈值,会把Memstore中的数据Flush到StoreFile中;
7-当StoreFile越来越多,会触发Compact合并操作,把过多的StoreFile合并成也给大的StoreFile。当StoreFile越来越多,Region也会越来越大,达到阈值后,会触发Split操作,将Region一份为二;
因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生。

贴两张Hbase社区的分享文案,可以好好的帮助理解一下
在这里插入图片描述
在这里插入图片描述

Hbase预分区

每一个region维护着startRow与endRowkey,如果加入的数据符合某个region维护的rowkey范围,则该数据交给这个region维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高Hbase的性能。
1-手动设定预分区

hbase> create 'staff','info','partition1',SPLITS=>['1000','2000','3000','4000']

2-生成16进制序列预分区

create 'staff2','info','partition2',{NUMREGIONS=>15,SPLITALGO=>'HexStringSplit'}

3- 按照文件中设置的规则预分区
创建splits.txt文件内容如下:

aaaa
bbbb
cccc
dddd

然后执行:

create 'staff3','partition3',SPLITS_FILE=>'splits.txt'

4-使用javaAPI创建预分区

//自定义算法,产生一系列Hash散列值存储在二维数组中
byte[][] splitKeys = 某个散列值函数
//创建HBaseAdmin实例
HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create());
//创建HTableDescriptor实例
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
//通过HTableDescriptor实例和散列值二维数组创建带有预分区的HBase表
hAdmin.createTable(tableDesc, splitKeys);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值