一、整体架构
1.Client客户端:操作HBase的入口
2.Zookeeper:
(1)HMaster的主备选举
(2)心跳检测
(3)保存meta表,用于查询region
3.HMaster:
(1)主节点,负责管理HRegionServer的负载均衡和table的创建
(2)当region分裂时,负责将新region分配到具体的HRegionServer
(3)当HRegionServer宕机时,则负责其上的region转移
4.HRegionServer:
(1)从节点,负责数据的读写请求
(2)当region过大时进行切分
5.Region:HBase的最小存储单元
二、存储原理
1.store列族:可以理解为关系型数据库中的字段,如果一个表有N个store,则每个region有多个store
2.memstore:每个store都会有一个memstore(内存区域)用于写入数据的缓冲
3.StoreFile:当memstore达到阈值进行刷盘则会生成新的StoreFile,每个store可以有多个StoreFile
三、读取流程
1.client到zookeeper获取meta表
2.根据namesapce、表名、rowkey查询meta表,获取对应region
3.找到对应HRegionServer下的region
4.先从memstore中查找数据,如果没有,再到BlockCache中获取
5.如果BlockCache中也没有,再到StoreFile上进行读取
6.StoreFile中读取到数据后,先写BlockCache再返回给客户端
四、写入流程
1.client到zookeeper获取meta表
2.根据namesapce、表名、rowkey查询meta表,获取对应region
3.找到对应HRegionServer下的region
4.把数据写入HLog和memstore各一份
5.memstore到达阈值刷盘生成storeFile
6.删除HLog中的历史数据
五、flush触发机制
1.memstore大小达到阈值,默认为128M
2.所有memstore总和达到阈值,默认128*2=256M
3.HLog数量达到阈值
4.定期刷新memstore,默认周期为1小时
5.手动flush,flush ‘tablename’或者flush ‘region name’
六、compaction合并机制
1.minor compaction小合并:触发频率高,仅将小的临近的storeFile合并成一个大的storeFile,对更新、删除数据做标记
<!--默认值3;表示一个store中至少有4个store file时,会触发minor compaction-->
<property>
<name>hbase.hstore.compactionThreshold</name>
<value>3</value>
</property>
<!--默认值10;表示一次minor compaction中最多合并10个store file-->
<property>
<name>hbase.hstore.compaction.max</name>
<value>10</value>
</property>
<!--默认值为128m;表示store file文件大小小于该值时,一定会加入到minor compaction的-->
<property>
<name>hbase.hstore.compaction.min.size</name>
<value>134217728</value>
</property>
<!--默认值为LONG.MAX_VALUE;表示store file文件大小大于该值时,一定会被minor compaction排除-->
<property>
<name>hbase.hstore.compaction.max.size</name>
<value>9223372036854775807</value>
</property>
2.major compaction大合并:合并频率较低,默认7天一次,生产环境需要关闭该功能,手动触发major_compact tableName,将所有的StoreFile合并成一个StoreFile,清理删除的数据,过期的数据和版本号超过设定的数据
<!--默认值为7天进行一次大合并,-->
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
七、预分区
1.预分区意义:增加数据读写效率、负载均衡,防止数据倾斜、方便集群容灾调度region、优化Map数量
2.预分区原理:每个region维护startRow和endRow,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。
3.手动指定预分区
1.直接创建时使用数组指定
create 'person','info1','info2',SPLITS => ['1000','2000','3000','4000']
2.把分区规则创建于文件中
cd /book/install
vim prepart.txt
create 'student','info',SPLITS_FILE => '/book/install/prepart.txt'
3.HexStringSplit算法
create 'mytable', 'base_info',' extra_info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}