hbase数据写入流程深度解析

  

2019/3/28星期四
hbase数据写入流程深度解析
在看此链接之前,可以写查看hbase读写请求详细解释中的写请求流程https://blog.51cto.com/12445535/2356085

  

简介:
hbase设置之初就是为了应对大量的写多读少的应用,他出色的写性能,在一个100台RS的集群可以轻松地支撑每天10 t的写入量。
hbase的写数据流程大体分为3部分
1,客户端的写入流程
2,服务端的写入流程
3,细胞膜的工作原理

  

我们先回顾一下hbase写数据流程
写请求处理过程小结
1客户端向地区服务器提交写请求
2地区服务器找到目标区域
3区域检查数据是否与模式一致
4如果客户端没有指定版本,则获取当前系统时间作为数据版本
5将更新写入细胞膜日志
6将更新写入Memstore
7判断Memstore的是否需要冲洗为存储文件。

  

第一部分:客户端的写入流程
客户端流程解析:
1,用户提交把请求后,HBase客户端会将把请求添加到本地缓冲中,符合一定条件就会通过AsyncProcess异步批量提交。
HBase默认设置autoflush=true,表示把请求直接会提交给服务器进行处理;
2,用户可以设置autoflush=false,这样的话放请求会首先放到本地缓冲区,等到本地缓冲大小超过一定阈值(默认为2 m,可以通过配置文件配置)之后才会提交。很显然,后者采用组提交机制提交请求,可以极大地提升写入性能,但是因为没有保护机制,如果客户端崩溃的话会导致提交的请求丢失。
//提示:
鼎晖集群中HBase默认是使用autoflush=false也就是首先会把数据放在本地的缓冲区中
HBase客户端写入缓冲
hbase.client.write。缓冲=2米//写入缓冲区大小(以字节为单位)。较大缓冲区需要客户端和服务器中有较大内存,因为服务器将实例化已通过的写入缓冲区并进行处理,这会降低远程过程调用(RPC)的数量。为了估计服务器已使用内存的数量,请用值“hbase.client.write.buffer”乘hbase.regionserver.handler以”。”。
HBase地区服务器处理程序计数
hbase.regionserver.handler。数=30//RegionServer中启动的RPC服务器实例数量
3,在提交给服务端之前,HBase会在元数据表.meta。中根据rowkey找到它们归属的区域服务器,这个定位的过程是通过HConnection的locateRegion方法获得的。如果是批量请求的话还会把这些rowkey按照HRegionLocation分组,每个分组可以对应一次RPC请求。
4, HBase会为每个HRegionLocation构造一个远程RPC请求MultiServerCallablenewCaller()执行调用,忽略掉失败重新提交和错误处理,客户端的提交操作到此结束。

  

第二部分:服务端写入流程
服务端流程解析
(1)获取行锁,地区更新共享锁——》(2)开始写事务——》(3)写缓存memstore——》(4)构造waledit并附加hlog——》(5)
释放行锁,共享锁——》(6)同步hlog -》(7)结束写事务——》(8)冲洗memstore
//解释
(1)获取行锁,地区更新共享锁:HBase中使用行锁保证对同一行数据的更新都是互斥操作,用以保证更新的原子性,要么更新成功,要么失败。
(2)开始写事务:获取写数字,用于实现MVCC,实现数据的非锁定读,在保证读写一致性的前提下提高读取性能。
(3)写缓存memstore: HBase中每列族都会对应一个商店,用来存储该列数据。每个商店都会有个写缓存memstore,用于缓存写入数据.HBase并不会直接将数据落盘,而是先写入缓存,等缓存满足一定大小之后再一起落盘。
(4)附加hlog: HBase使用的WAL机制保证数据可靠性,即首先写日志再写缓存,即使发生宕机,也可以通过恢复hlog还原出原始数据。该步骤就是将数据构造为waledit对象,然后顺序写入hlog中,此时不需要执行同步操作.0.98版本采用了新的写线程模式实现hlog日志的写入,可以使得整个数据更新性能得到极大提升,具体原理见下一个章节。
(5)释放行锁以及共享锁
(6)同步hlog: hlog真正同步到HDFS,在释放行锁之后执行同步操作是为了尽量减少持锁时间,提升写性能。如果同步失败,执行回滚操作将memstore中已经写入的数据移除。
(7)结束写事务:此时该线程的更新操作才会对其他读请求可见,更新才实际生效。具体分析见文章《数据库事务系列HBase行级事务模型》
(8)冲洗memstore:当写缓存满128之后,会启动平线程将数据刷新到硬盘。刷新操作涉及到HFile相关结构,后面会详细对此进行介绍。
//HBase memstore刷新大小
hbase.hregion.memstore.flush。大?128//如memstore大小超过此值(字节数),memstore将刷新到磁盘。通过运行由hbase.server.thread。wakefrequency指定的频率的线程检查此值。

hbase数据写入流程深度解析