HBase Compaction & Split

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’}

关闭Auto-Split:切分策略为ConstantSizeRegionSplitPolicy,hbase.hregion.max.filesize设置为很大

  • force-Split
    • hbase shell
      split ‘test1’,‘b’ //b为切分指定的rowkey(即切分点)
    • web界面 split

  • auto-split的实现
    Auto-Split 流程
  • 太多的region
    regionserver上所有的MemoryStore加起来的大小如果大于hbase.regionserver.global.memstore.upperLimit,默认为堆内存的40%,则会进行flush
    region越多,每个region对应多个memoryStore,故memStore越多,内存固定,会产生大量的hfile小文件,此时compaction很多。Region => compactions越多 => compaction storm
    • 影响
      1. snapshots time out
      2. compaction storms
      3. 客户端的操作超时(如flush)
      4. bulk load会超时(抛出 RegionTooBusyException)
    • 原因
      1. 为每一个Region的file size(max.filesize)设置过小
      2. 不合理的对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’’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值