一,客户端client
1, Htable API 调用put方法发送写入请求,zookeeper查找系统表.ROOT.定位.mete.表存储位置,
2, 到定位的HRS(hregionserver)根据tablename以及rowkey直接定位region的HRS
3, 定位了region的HRS,接着client 跟 hregionserver通信,处理region写请求
二,服务端hregionserver
1, 写wal(write ahread log)(可以程序设置不写),wal写成功接着写memorystore
2, memorystore 超出配置 hbase.hregion.memstore.flush.size 的大小时,拷贝副本(副本拷贝时block写入操作),副本add到flush队列,等待flush线程进行flush到磁盘
3,MemorystoreFlusherThread 监控hregionserver 的memorystore 总大小 超出hbase.regionserver.global.memstore.upperLimit/lowerLimit配置时(默认0.4/0.35 * HRegionServer 的 heap 堆内存大小/在hbase-env.sh 的 export HBASE_HEAPSIZE=10240 参数设置),block hregionserver的写入操作,待flush部分到磁盘,重新wakeup写入操作,一般hregionserver日志中出现
regionserver.MemStoreFlusher: Blocking updates on arch0973,60020,1393482371785: the global memstore size 4.0 G is >= than blocking 4.0 G size,意味着超出。
4, 对应region下memorystore flush到磁盘的文件storefile数超出hbase.hstore.blockingStoreFiles时则block所有的写请求进行compaction,以减少storefile数量(可优化配置)
5, compaction(跟据数据标志合并,过滤旧版本)所有的storefile得到一个大的storefile,当大的storefile filesize 大于hbase.hregion.max.filesize,region进行split,region拆分,下线,也相应block相应的写入操作