Compaction
memoryStore在满足两个条件后,就会flush。
随着时间的推移,Store中的小Hfile越来越多,导致性能下降,故需要compaction。
- compaction即将小的HFile合并成大的Hfile文件。
- Compaction
- Minor compactions:一个store中hfile合并成一个大的hfile
- Major compactions:合并一个表的所有Store中的HFile,使得一个Store只有一个HFile(一个CF一个HFiel)
- major compactions 会删除无用数据(过期、删除等)
- 默认是每七天执行一次。配置(hbase.hregion.majorcompaction 单位是毫秒,默认为7天) major compaction可以手动触发(shell 或 web界面)。
Split
HBase 中数据越来越大,会拆分为多个Region
- Pre-split
创建表的时候,一张表只有一个region
此时若客户端有高并发,数以亿计的请求,此时保存有Hregion的RegionServer存在一个Hotspoting问题,影响HBase性能- 采用pre-split解决
1. create 'table_pre_splits','cf1',SPLITS=>['10','20','30'] //此时会有四个region 10,20,30分别是region划分点
2. create 'table2','cf1',SPLITS_FILE=>'splits.txt' //还可按splits.txt文件内容划分
- Region Split-pre split
1. create 't2','f1',{NUMREGION=4,SPLITALGO=>'UniformSplit'}//节省空间,但是可读性较差,用于rowkey是随机的字节,最小值为(byte)0x00,最大0xFF
rowkey转到16进制(二进制),然后根据rowkey值分配region
2. create 't2','f1',{NUMREGION=4,SPLITALGO=>'HexStringSplit'}//需要更多空间,可读性较好,用于rowkey十六进制的字符串,最小值00000000,最大值FFFFFFFF
- Auto-Split
Pre-split会在创建表的时候会产生指定个数的region,当一个region达到一定大小时候,会自动切分为多个region- 切分策略
- ConstantSizeRegionSplitPolicy 当一个Region的大小大于hbase.hregion.max.filesize(默认10G)就切分
- IncreasingToUpperBoundRegionSplitPolicy(默认切分策略)
Min(R^3 * “hbase.hregion.memstore.flush.size * 2” , hbase.hregion.max.filesize) 其中R为Hregion的数量 - KeyPrefixRegionSplitPolicy
如果你的roekey有前缀的话,相同前缀的rowkey肯定在一个region里面,可以使用该种拆分策略
- 配置默认切分策略
- hbase-site.xml 配置
hbase.hregionserver.region.split.policy - 使用Java API在创建表的时候指定切分策略 (HTableDescriptor)
tableDesc.setValue(···SPLIT_POLICY,···) - hbase shell 创建表指定拆分策略
create ‘test’,{‘METADATA’=>{‘SPLIT_POLICY’=>’···’}},{‘NAME’=>‘cf1’}
- hbase-site.xml 配置
- 切分策略
关闭Auto-Split:切分策略为ConstantSizeRegionSplitPolicy,hbase.hregion.max.filesize设置为很大
- force-Split
- hbase shell
split ‘test1’,‘b’ //b为切分指定的rowkey(即切分点) - web界面 split
- hbase shell
- auto-split的实现
- 太多的region
regionserver上所有的MemoryStore加起来的大小如果大于hbase.regionserver.global.memstore.upperLimit,默认为堆内存的40%,则会进行flush
region越多,每个region对应多个memoryStore,故memStore越多,内存固定,会产生大量的hfile小文件,此时compaction很多。Region => compactions越多 => compaction storm- 影响
- snapshots time out
- compaction storms
- 客户端的操作超时(如flush)
- bulk load会超时(抛出 RegionTooBusyException)
- 原因
- 为每一个Region的file size(max.filesize)设置过小
- 不合理的对region进行了split或pre-split
- 合并region (hbase shell)
merge_region 'region_name1','region_name2',[true] //true会立即执行
- 影响
balancing
保持region可以均匀的分布在每一个RegionServer上
HMaster每间隔 hbase.balancer.period(默认5分钟)对region进行一次balanceing
Snapshot
快照功能
开启功能:在hbase-site.xml中配置
hbase.snapshot.enable设置为true;
snapshot 'mytable','my_table_snapshot_$date'
list_snap_shots
crud
想恢复表到某一个snapshots 的版本
disable 'my_table '
restore_snapshot 'my_table_snapshots_$date'
enable 'my_table'//这样表会恢复到snapshots的版本
同时可以将snapshots里面的数据恢复到一张新表里面
clone_snapshot 'my_table_snapshots_$date','my_new_table'
delete_snapshot my_table_snapshots_$date’’