Hbase架构下
Hbase内存大小默认为32G或64G。
一般的,我们设计Hbase时考虑的是在每个服务器上面运行少量(20-200)但是相对于数量来说较大容量(5-20G)的regions。所以我们需要考虑以下因素
- MSLAB (MemStore-local allocation buffer) 如果每个MemStore有2MB的缓存(注意是每个列簇2M的缓存),如果你有1000个regions并且表设计为2个列簇,那么将会有3.9GB的堆内存是被使用,并且很有可能这些内存不存储时间。注意:2MB是可以配置的。
- 而Master对于regions的个数是很敏感的,如果regions个数过多,Master在加载和移动batches时会有很重的负担,因为这些都过重依赖于ZK。
- 在就版本中(HFileV2。0.90版本之前)。会有一个问题导致默写regionServer的索引激增。这很可能会导致Hbase出现OOM
- 另一个很重要的因素却是和MR集成时,3-5个Regions好像不能发挥出MR的所有性能,而过大的Regions呢,对MR来说又是一个太高的负载,因为会启动太多的MR作业。
- 关于Regions最大个数的计算,是有公式的:
- 总的公式如下:
Startup开始
当Hbase启动时,Regions会按照如下进行分配(短版本):
- Master 启动是调用AssignmentManager upon 。
- AssignmentManager 到 hbase:meta中查看已有的regions 。
- 如果regions是有效的,那么保持现状。
- 如果无效,那么调用LoadBalancerFactory来分配该region。主要是启动了负载均衡。
- hbase:meta更新该状态。
- Failover失败救援
- 当RegionServer失败了 :
- 1、regions会立即变的不可用。
- 2、Master 会检测到RegionServer 已经 failed。
- 3、region将会被重新分配,就像startup的步骤一样。
- 4、已经被提交的查询还是会继续执行的,并不会丢失。
- 5、在以下时间内,操作会被提交到一个新的RegionServer中:
- ZooKeeper session timeout + split time + assignment/replay time
- Region Load Balancing负载均衡
- Regions会周期性的进行LoadBalancer。通过配置hbase.balancer.period;默认的时间是5分钟
- Region State Transition状态转换
- HBase 的这些状态都维护在ZK中,以下是一些状态列表:
- Possible Region States可能的状态信息
- OFFLINE : 离线
- OPENING : 打开中
- OPEN : 已经打开
- FAILED_OPEN : 打开失败
- CLOSING : 关闭中
- CLOSED : 关闭
- FAILED_CLOSE : 关闭失败
- SPLITTING : 正在分裂
- SPLIT : 分裂完成
- SPLITTING_NEW : 将要分裂
- MERGING : 合并中
- MERGED : 已合并
- MERGING_NEW : 将要合并
Region-RegionServer Locality存储位置
因为数据存储在HDFS上面,所以符合HDFS存储块的机制。如下面步骤:
- 第一个replica i就存储在本地
- 第二个replica 随机存储在另一个 机架上。(如果有的话)
- 第三个replica 存储在本机架上的另一个几点。
Store
Store 中的 MemStore 有0或多个StoreFiles (HFiles)。Store主要存储表中的一个列簇。
MemStore
MemStore 在启动刷新时,会将内存存入快照,并且随后删除。注意:当启动Flush之后,region中的所有MemStore都会被flush
MemStore Flush
以下会触发flush操作。
1、当一个 MemStore达到hbase.hregion.memstore.flush.size所指定的大小时。128M
2、当 MemStore 的全局使用量 hbase.regionserver.global.memstore.upperLimit达到时, 一个regionServer中的所有regions都会启动flush
3.当预习日志达到阈值时也会触发全局性的falush
StoreFile (HFile)
StoreFiles 真实数据所在。
Blocks
StoreFiles是由blocks组成的。
KeyValue
KeyValue类是HBase中的数据存储的核心。KeyValue包装了一个字节数组,并将偏移量和长度作为传递给传递的数组,该数组指定了将内容作为键值开始的位置。
当MemStore的大小 到了规定的大小 ( hbase.hregion.memstore.flush.size ), 它会将数据flush到StoreFile。随着时间的增加,store中的storefile数量也会增加。Compaction 是将这些storefile进行合并的操作,从而减少storeFile的数量并且提高性能。
Compactions 有两种: minor and major。Minor 和major compactions 有以下不同。
Minor compactions 通常会将小的并且相邻的那些storeFile合并成一个大的StoreFile。注意Minor Compactions并不会删除过期版本。
注意:major compaction主要是用来提升性能的。默认情况下是每7天运行一次,但是在生产环境中并不一定适合。因为进行major compaction的时候可能会影响集群性能。所以这需要根据实际情况去设定这个值。
Compactions 并不是 region merges。
Compaction Policy - HBase 0.96.x and newer配置
通过 compaction 配置策略,可以保证何时minor compaction 何时major compaction。
HBase 0.96.x之前, 只有一种compaction策略。那就是 RatioBasedCompactionPolicy。新的默认策略是 ExploringCompactionPolicy 。
Being Stuck被卡主
当MemStore 太大时 , 它需要将数据刷入到一个StoreFile. 然而, 一个Store 只能有
hbase.hstore.blockingStoreFiles 个StoreFiles,所以这个时候它可能会在算法中被卡主。而compaction算法对这种情况进行了检查,并且对于这种情况进行优化。
The ExploringCompactionPolicy Algorithm
ExploringCompactionPolicy 算法,主要是从不同的文件组合中找到最优解。这样相对于Ratio算法来说,有更好的性能,更少的IO更加频繁的major compaction。
hbase.hstore.compaction.min
进行minor compaction的最小storefiles数目。注意:如果设置为2,那么一个store中如果有两个storefiles就会触发minor compaction。如果将这个值设置很高,那么其他相关配置也要进行相应的调整。大多数情况下,默认配置是合适的。在之前的版本,该配置叫做hbase.hstore.compactionThreshold
Default: 3
hbase.hstore.compaction.max
一次minor compaction最多可以选择的Storefiles文件数量。大多数情况下,默认配置是合适的。
Default: 10
hbase.hstore.compaction.min.size
小于这个配置的storefiles一定会被放入minor compaction中。
Default:128 MB
hbase.hstore.compaction.max.size
大于该值的storefiles将会被排除在minor compaction之外,注意默认值是Long的最大值,也就是几乎没有可能会将storefiles排除在外,所以如果你觉得你的minor compaction发生过于频繁,可以尝试更改改值。
Default: Long.MAX_VALUE
hbase.hstore.compaction.ratio
将store file 按照文件年龄排序(older to younger),minor compaction总是从older store file开始选择,如果该文件的size 小于它后面hbase.hstore.compaction.max 个store file size 之和乘以 该ratio,则该store file 也将加入到minor compaction 中。
Default: 1.2F
hbase.hstore.compaction.ratio.offpeak
非峰值时的ratio配置,作用和上面一样。
Default: 5.0F
hbase.offpeak.start.hour
非峰值的开始时间
Default: -1 (disabled)
hbase.offpeak.end.hour
非峰值的结束时间
Default: -1 (disabled)
hbase.regionserver.thread.compaction.throttle
Compaction有两种压缩线程池,一个大的一个小的。该值是确定使用大的线程池还是小的线程池。大多数情况下,默认值是何时的
Default: 2 x hbase.hstore.compaction.max x hbase.hregion.memstore.flush.size (which defaults to 128 )
hbase.hregion.majorcompaction
Major compaction的时间,单位为毫秒
Default: 7 days ( 604800000 milliseconds)
hbase.hregion.majorcompaction.jitter
设定一个major compaction的浮动区间。比如按照默认值,该区间为:7±(7*0.5)
Default: .50F
Compaction File Selection文件选择