HBase 底层读写过程
1、读请求过程:
HRegionServer 保存着 meta 表以及表数据,要访问表数据,首先 Client 先去访问 zookeeper,从 zookeeper 里面获取 meta 表所在的位置信息,即找到这个 meta 表在哪个 HRegionServer 上保存着。
接着 Client 通过刚才获取到的 HRegionServer 的 IP 来访问 Meta 表所在的 HRegionServer,从而读取到 Meta,进而获取到 Meta 表中存放的元数据。
Client 通过元数据中存储的信息,访问对应的 HRegionServer,然后扫描所在 HRegionServer 的 Memstore 和 Storefile 来查询数据。
最后 HRegionServer 把查询到的数据响应给 Client。
查看 meta 表信息
hbase(main):011:0> scan 'hbase:meta'
2、写请求过程:
Client 也是先访问 zookeeper,找到 Meta 表,并获取 Meta 表元数据。
确定当前将要写入的数据所对应的 HRegion 和 HRegionServer 服务器。
Client 向该 HRegionServer 服务器发起写入数据请求,然后 HRegionServer 收到请求并响应。
Client 先把数据写入到 HLog,以防止数据丢失。
然后将数据写入到 Memstore。
如果 HLog 和 Memstore 均写入成功,则这条数据写入成功
如果 Memstore 达到阈值,会把 Memstore 中的数据 flush 到 Storefile 中。
当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile 合并成一个大的 Storefile。
当 Storefile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split 操作,将 Region 一分为二。
细节描述:
hbase 使用 MemStore 和 StoreFile 存储对表的更新。
数据在更新时首先写入 Log(WAL log)和内存(MemStore)中,MemStore 中的数据是排序的,当 MemStore 累计到一定阈值时,就会创建一个新的 MemStore,并 且将老的 MemStore 添加到 flush 队列,由单独的线程 flush 到磁盘上,成为一个 StoreFile。于此同时,系统会在 zookeeper 中记录一个 redo point,表示这个时刻之前的变更已经持久化了。
当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用 Log(WAL log)来恢复 checkpoint 之后的数据。
StoreFile 是只读的,一旦创建后就不可以再修改。因此 Hbase 的更新其实是不断追加的操作。当一个 Store 中的 StoreFile 达到一定的阈值后,就会进行一次合并(minor_compact, major_compact),将对同一个 key 的修改合并到一起,形成一个大的 StoreFile,当 StoreFile 的大小达到一定阈值后,又会对 StoreFile 进行 split,等分为两个 StoreFile。
由于对表的更新是不断追加的,compact 时,需要访问 Store 中全部的 StoreFile 和 MemStore,将他们按 row key 进行合并,由于 StoreFile 和 MemStore 都是经过排序的,并且 StoreFile 带有内存中索引,合并的过程还是比较快。
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/9daaadf728bbc69380b1f6ed2】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论