Hbase

一、架构图

在这里插入图片描述

1)StoreFile
保存实际数据的物理文件,StoreFile 以 HFile 的形式存储在 HDFS 上。每个 Store 会有
一个或多个 StoreFile(HFile),数据在每个 StoreFile 中都是有序的。
2)MemStore
写缓存,由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好序后,等到达刷写时机才会刷写到 HFile,每次刷写都会形成一个新的 HFile。
3)Hlog/wal
由于数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中会有很高的
概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件
中,然后再写入 MemStore 中。所以在系统出现故障的时候,数据可以通过这个日志文件重
建。
4) zk
承担master一部分工作,如与client交互,master对表结构的ddl操作

二、写流程

1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。 2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,
查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以
及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
3)与目标 Region Server 进行通讯;
4)将数据顺序写入(追加)到 WAL; 5)将数据写入对应的 MemStore,数据会在 MemStore 进行排序; 6)向客户端发送 ack; 7)等达到 MemStore 的刷写时机后,将数据刷写到 HFile。
在这里插入图片描述
源码流程:先在内存构建wal,将wal追加到上一次的wal下,不写到hdfs里,然后开始将数据写内存,然后释放锁,同步wal,如果同步失败,就删除内存中的数据,是一次事务。

三、MemStore Flush

MemStore 刷写时机:
1.当某个 memstroe 的大小达到了 hbase.hregion.memstore.flush.size(默认值 128M), 其所在 region 的所有 memstore 都会刷写。 当 memstore 的大小达到了
hbase.hregion.memstore.flush.size(默认值 128M) * hbase.hregion.memstore.block.multiplier(默认值 4)
时,会阻止继续往该 memstore 写数据。

2.当 region server 中 memstore 的大小达到
java_heapsize
*hbase.regionserver.global.memstore.size(默认值 0.4) hbase.regionserver.global.memstore.size.lower.limit(默认值 0.95),
region 会按照其所有 memstore 的大小顺序(由大到小)依次进行刷写。直到 region server
中所有 memstore 的总大小减小到上述值以下。 当 region server 中 memstore 的总大小达到
java_heapsize
hbase.regionserver.global.memstore.size(默认值 0.4)
时,会阻止继续往所有的 memstore 写数据。

3 到达自动刷写的时间,也会触发 memstore flush。自动刷新的时间间隔由该属性进行
配置 hbase.regionserver.optionalcacheflushinterval(默认 1 小时)。

4.当 WAL 文件的数量超过 hbase.regionserver.max.logs,region 会按照时间顺序依次进
行刷写,直到 WAL 文件数量减小到 hbase.regionserver.max.log 以下(该属性名已经废弃
现无需手动设置,最大值为 32)。

四、读流程

1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。

2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,
查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。

3)与目标 Region Server 进行通讯;

4)分别在 Block Cache(读缓存),MemStore 和 Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。

5) 将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到
Block Cache。 6)将合并后的最终结果返回给客户端。

在这里插入图片描述

五、删除数据

1.flush
如果在内存中知道已经过时了,则删除;
2.merge compact(大)
在磁盘中进行对比,谁过时谁删除;

六、DeleteAPI

非常绕,半天才明白过来:
1.指定Rowkey删除:删除所有版本数据,标记为DeleteFamily

2.指定Rowkey删除+时间戳:删除小于等于该时间戳的所有版本数据,标记为DeleteFamily

3.指定Rowkey+列族 删除:删除所有版本数据,标记为DeleteFamily

4.指定Rowkey+列族 删除+时间戳:删除小于等于该时间戳的所有版本数据,标记为DeleteFamily

5.指定列名删除(delete.addColumn):删除指定列最新版本,如果是flush前删除的话,以前的版本会再次出现,慎用,删除标记为Delete

6.指定列名删除(delete.addColumn)+时间戳:删除该时间戳的版本,与其他时间戳没有关系,删除标记为Delete

7.指定列名删除(delete.addColumns): 删除所有版本数据,标记为DeleteColumn;

8.指定列名删除(delete.addColumns)+时间戳: 删除小于等于该时间戳的所有版本数据,标记为DeleteColumn;

七、Hbase调优 -RowKey

hbase rowkey设计原创:散列性、唯一性、长度原则(80-100呗)

手机一个habse表保存某人每天的打电话的数据(按月份存储) 分区设置:

000 001 002 … 297 298

rowkey设置(分区号+手机号+年月日):

000_13140607369_2019-12-09 12:24:00

(保存的时候加其他时间更加细分数据)

使某个月的数据存在299个分区就用(手机号+2019+12)%299

取2月份该用户数据如下:

start_row: xxx_13140607369_2019-02
stop_row: xxx_13140607369_2019-03 或者 xxx_13140607369_2019-02|

属于左闭右开。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值