前言

读写流程是hbase中最重要也是最复杂的一个过程,本文主要是介绍hbase的读写是一个怎么样的过程




hbase 描述正确的是 请描述hbase的写入流程_hbase客户端

本图片摘自官网



1 Hbase写入流程

1.1 LSM树简介

Hbase是采用LSM(Log-Structured Merge Tree)架构,存储引擎和B树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能.

LSM数的设计思想如下:

将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。

LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能.

1.2 hbase写流程




hbase 描述正确的是 请描述hbase的写入流程_数据_02

RegionServer



第一步: Hbase客户端发起数据写入请求,基于rowKey和集群的元数据定位到数据被写入到哪台RegionServer,然后将请求发送给对应的RegionServer.

这里可以以put方法为例,尽量去详细描述这个过程,用户在用put写hbase的时候,数据会首先被提交到数据缓冲区,hbase中有个参数autoflush,该参数默认值是true,数据不会被写入到本地缓冲区,而是直接提交给服务器进行处理,我们可以设置为false,就是数据会被先写入到本地缓冲区,当缓冲区中数据 量达到一定阈值之后(默认是2M),会被提交到服务器,该方式为批评提交方式,可以极大提升吞吐量。

在数据被提交之前,客户端需要获取到该rowKey被写入到的regionserver信息,即元数据信息,写到哪个rs的哪个region,客户端首先到客户端缓存中去查找,如果在缓存中查找不到元数据信息,则先去zookeeper中/hbase-root/meta-region-server/查找hbase:meta表所在的regionserver,然后再查询hbase:meta查找rowkey所在的regionserver的region信息,当返回结果后,客户端会将查询到的元数据缓存本本地,以供下次使用.

第二步: RegionServer接收到数据请求之后,数据先别写入WAL日志,然后再写入Memstore,这样做的原因是防止RegionServer机器挂掉后,Memstore内存中的数据丢失

第三步: 第二步中数据写入Memstore中以后,Hbase客户端就认为数据已经写入完成了,可以看出,Hbase写是一个异步的过程,当Region的Memstore中的容量达到一定阈值之后,就会触发flush操作,将Memstore中的数据刷写到磁盘。生成HFile文件。

该步骤中我们需要了解下面几个知识点:

1 memstore什么时候刷写,即刷写时机

2 flush的整体流程

3 如何生成HFile