hbase 学习笔记一---基本概念(二)
了存储-ROOT-表的地址和Hmaster 的地址,HRegionServer 也以Ephemeral的方式注册到Zookeeper中,这样Hmaster 就可以随时感知到各个
RegionServer的健康状况,还有就是Zookeeper通过Election的方式 避免了Hmaster的单点问题。
保证任何时候,集群中只有一个master
存贮所有Region的寻址入口。
实时监控RegionServer的状态,将Region server的上线和下线信息实时通知给Master
存储Hbase的schema,包括有哪些table,每个table有哪些column family
6、Hmaster
上面说了,Zookeeper避免了HMaster的单点问题,一个Hbase集群可以启动多个HMaster,而Zookeeper通过Election的方式保证集群中只有一个HMaster处于live的状态
其它都处于休眠的状态,如果HMaster出现问题,则Zookeeper 则唤醒其它休眠的HMaster。
HMaster 在功能上主要负责哪些工作呢?
1、管理用户对Table的增、删、改、查操作
2、管理RegionServer的负载均衡、调整Region的分布
3、在Region Split后,将新Region分布到不同的RegionServer。
4、在RegionServer宕机后,那该RegionServer上所管理的Region 由HMaster进行重新分配。
总结HMaster 的主要任务:1、HTable DDL 操作 2、Region 分配工作。 其余的基本上都是client 和RegionServer打交道来完成的。
7、HRegionServer
HRegionServer 主要负责相应用户的I/O请求,进而跟HDFS交互,从HDFS中读写数据,虽然每个进程都很重要,但个人认为HRegionServer是HBase中最核心的进程。
下面对HRegionServer的内部结构做一个简单描述:
HRegionServer 内部管理了一系列的HRegion对象,HRegion和Region是一回事吗?其实HRegion对应了Table中的一个Region,HRegion是对其进行的封装。每个HRegion
中由多个HStore组成。
HStore则对应Table中的Column Family,不论此Column Family 内部有多少数据,都会创建一个新的HStore,因此将相同属性的数据放进相同的Column Family 很有
必要,避免一次访问,访问多个HStore,性能低下。而HStore 则是HBase的核心的存储单元了,而HStore 由两个部分组成,一时MemStore,再就是StoreFile
MemStore 是Sorted Memory Buffer ,client 写入的数据先写入MemStore,当达到MemStore的阀值时,将其Flush 成为一个StoreFile(HFile),StoreFile 则是存储在硬盘上的
文件,具体这个阀值时多少?
hbase.hregion.memstore.flush.size 这个参数表示每个MemStore的大小,当然
系统默认是134217728 bytes 也就是128M,这个参数需考虑每个RS负担的Region个数。
这个参数的作用是当单个Region内所有的memstore大小总和超过指定值时,flush该region的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产
消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。
上面说到,当该Region下所有的MemStore 之和超过指定值时,就触发flush,而前面又说了在一个Region下 每个Column Family 一个HStore ,那多个Column Family 这样
问题出来了,如果一个HStore数据量大,而另外一个HStore 仅有几条数据,会同时 flush吗 对,这就说明了一个问题,在Hbase表设计的时候尽量设置单一ColumnFamily的
表,否则Hbase不能很好的处理上面类似的问题。
除了上面的参数还有两个参数
hbase.regionserver.global.memstore.upperLimit 默认 0.4 也就是40%
为了防止MemStore占用总内存过大,当RegionServer所有Region达到总heap内存的40%,Hbase会Block所有的更新,来flush所有的MemStore,并释
放MemStore占用的内存
hbase.regionserver.global.memstore.lowerLimit 默认是 0.35 也就是 35%
这个参数表示,当该RegionServer 下所有的MemStore达到 总Heap 内存的35%时,触发flush个别占用内存大的MemStore,这是会做block,写更新还
是会收影响。