HBase 表操作

Hbase 表操作

Master:负责启动的时候分配Region到具体的RegionServer,执行各种管理操作。

RegionServer:有一个或多个Region。

Region:表的一部分数据。HBase是一个会自动分片的数据库


一个WAL:预写日志,是一个环状滚动日志,当操作到达Region时,Hbase先将操作写到WAL中。HBase先把数据放到基于内存实现的Memstore中,等数据到达一定数量时才刷到HFile中。如果期间服务器宕机或者断电,数据丢失,WAL就是一个保险机制。当故障恢复时候,就可以从WAL中恢复数据。

# 开启异步写入WAL
Mutation.setDurability(Durability.ASYNC_WAL);

Region在满足hbase.regionserver.optionallogflushinterval条件才会写入,默认时间间隔是1s。

检查间隔由hbase.regionserver.logroll.period定义,默认为1小时。

WAL文件的最大数量通过hbase.regionserver.maxlogs定义,默认为32。

  • 当WAL文件所在的块快要满了
  • WAL所占的空间大于或等于某个阈值
hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier

WAL被创建出来之后会放在/hbase/.log下,归档之后放在/hbase/.oldlogs下。

Master会定时清理.oldlogs

  • TTL进程:保证WAL文件一直存活,达到hbase.master.logcleaner.ttl定义的超时时间为止(默认十分钟)
  • 备份机制(replaction):如果开启了HBase的备份机制,那么HBase要保证备份集群已经完全不需要这个WAL文件了,才会删除。

Store内部结构

  • MemStore:每个Store中有一个MemStore实例。数据写入WAL之后就会被放入MemStore。MemStore是内存的存储对象,只有当MemStore满了才会将数据写入到HFile中。
  • HFile:在Store中有多个HFile。当MemStore满了之后HBase就会生成一个新的HFile,然后把MemStore中的内容写入到这个HFile中,HFile直接跟HDFS打交道,是数据的存储实体。

HDFS上的数据只能创建,追加和删除,对于一个数据库来说,按顺序存放数据是非常重要的,是性能的保障,所以不能按照数据到来的顺序写入硬盘。

使用内存先把数据整理成顺序存放,然后再一起写入硬盘。

MemStore

HBase使用了LSM树结构存储数据。数据现在MemStore中整理成LSM树,在刷写到HFile中。读取的时候有个专门的缓存叫BlockCache,如果开启BlockCache,先读取BlockCache,读取不到才读HFile+MemStore。如果数据添加后又删除了,则刷写的时候就直接不把这个数据写入到HDFS中。

HFile

在HBase中一个块默认大小为64KB,在列族上的BLOCKSIZE属性定义。

  • Data:数据块,每个HFile存在多个Data块,
  • Meta:元数据块,可选的,只有在文件关闭时才会写入,存储了HFile文件的元数据信息。
  • FileInfo:文件信息,必要存储信息,只有在文件关闭的时候写入,存储的是该文件的信息。
  • DataIndex:存储Data块索引信息的块文件。也就是Data块的偏移值,
  • MetaIndex:Meta块索引信息的块文件。
  • Trailer:必须,存储了FileInfo,DataIndex,MetaIndex块的偏移值。

Data块

第一位存储的是块的类型,后面存储的是多个KeyValue键值对,也就是单元格(Cell)的实现类,Cell是一个接口,KeyValue是它的实现类。

BlockType(块类型):Data、Meta、FILE_INFO、ROOT_INDEX...

一个KeyValue类里面最后一个部分是存储数据的Value,而前面的部分是存储该跟单元格相关的元数据信息。如果你存储的value很小,那么该单元格绝大部分空间都是rowkey、column family、column等元数据。

Region的定位

  1. 客户端通过ZK的/hbase/meta-region-server节点查询到哪台RegionServer上有hbase:meta表。
  2. 客户啊短连接含有hbase:meta表的RegionServer,hbase:meta表存储了所有Region的行键范围信息,通过这个表就可以查询出需要存取的rowkey属于哪个Region的范围里面,以及这个Region又属于RegionServer。
  3. 客户端直连一台拥有要存取rowkey的RegionServer,并对其直接操作。
  4. 客户端把hbase:meta的信息直接缓存起来。

一个Region包含多个Store:一个Store对应一个列族的数据,如果一个表有两个列族,那么在一个Region中就有两个Store,每个Store内部有MemStore和HFile两部分。

原文地址:https://www.cnblogs.com/iFanLiwei/p/13408784.html