1. Put及flush
a. Client提交put,若设置autoflush=false,则直接提交到regionserver,若为true,则等到2M或者执行hbase.flushcommits()提交给rs.
b. Put到Regionserver层次,先判断则这台regionserver的 所有memstore的总占用内存是否大于最大值内存(heap size *hbase.regionserver.global.memstore.upperLimit(0.4)),若大于 则提交一个对象到flushqueue中,这时flushthread线程不停的从flushqueue中获得请求,然后选择其中一个region进行Flush,直到这台regionserver的 所有memstore的总占用内存小于最小内存(heap size *hbase.regionserver.global.memstore. lowerLimit(0.35)),而regionserver主线程在等待5秒后,判断若小于最大内存,则继续提交put到region上,否则一直提交对象到flushqueue。
c. Region层次, Put时,一个HRegion中所有HStore中MemStore的总Size大于hbase.hregion.memstore.flush.size(64MB)*hbase.hregion.memstore.block.multiplier(2)时. 先flush,再等待10秒再检查是否大于, 若不大于,则继续执行此次put.否则继续等待
在flush region时会先检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact,并将flush推迟,而flush推迟的过程中(重新加入队列),可能会导致其他memstore中写了很多的数据,则这台regionserver的 所有memstore的总占用内存大小超过最大内存值,regionserver会阻塞住此时的往memstore写/删除请求,等到memstore大小降下去后才会恢复。
在flush后都会检查是否需要split和compact.
在put完成之后,会检查region总memestore size是否大于hbase.hregion.memstore.flush.size(64MB),若是,则执行一次flush.
Flush时可读可写。
注意hbase.hregion.memstore.flush.size的level是HRegion,也就是说当HRegion的总memstore大小大于此值时,会flush.
Flush和compact,split都是region level的,也就是说如果触发,将在一个region范围内进行,当然触发前提条件不一样。
a. Client提交put,若设置autoflush=false,则直接提交到regionserver,若为true,则等到2M或者执行hbase.flushcommits()提交给rs.
b. Put到Regionserver层次,先判断则这台regionserver的 所有memstore的总占用内存是否大于最大值内存(heap size *hbase.regionserver.global.memstore.upperLimit(0.4)),若大于 则提交一个对象到flushqueue中,这时flushthread线程不停的从flushqueue中获得请求,然后选择其中一个region进行Flush,直到这台regionserver的 所有memstore的总占用内存小于最小内存(heap size *hbase.regionserver.global.memstore. lowerLimit(0.35)),而regionserver主线程在等待5秒后,判断若小于最大内存,则继续提交put到region上,否则一直提交对象到flushqueue。
c. Region层次, Put时,一个HRegion中所有HStore中MemStore的总Size大于hbase.hregion.memstore.flush.size(64MB)*hbase.hregion.memstore.block.multiplier(2)时. 先flush,再等待10秒再检查是否大于, 若不大于,则继续执行此次put.否则继续等待
在flush region时会先检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact,并将flush推迟,而flush推迟的过程中(重新加入队列),可能会导致其他memstore中写了很多的数据,则这台regionserver的 所有memstore的总占用内存大小超过最大内存值,regionserver会阻塞住此时的往memstore写/删除请求,等到memstore大小降下去后才会恢复。
在flush后都会检查是否需要split和compact.
在put完成之后,会检查region总memestore size是否大于hbase.hregion.memstore.flush.size(64MB),若是,则执行一次flush.
Flush时可读可写。
注意hbase.hregion.memstore.flush.size的level是HRegion,也就是说当HRegion的总memstore大小大于此值时,会flush.
Flush和compact,split都是region level的,也就是说如果触发,将在一个region范围内进行,当然触发前提条件不一样。