冰冻三尺非一日之寒,学习也是如此!
仅为知识扫盲篇,扫盲篇啊,基础性的知识!
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);