java基础知识点扫盲_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数量一致,请参考如下架构图:

b417999d7786

Hbase架构.jpg

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社区的分享文案,可以好好的帮助理解一下

b417999d7786

Hbase写流程.PNG

b417999d7786

Region Split过程.PNG

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值