【胖鱼头】HBase处理逻辑

来源:互联网 发布:zabbix监控nginx 编辑:程序博客网 时间:2024/05/01 14:05
  • 每个表或有一个或多个HRegion,按行记录拆分。
  • HRegion是分布式存储和负载群衡的最基本单元,一个HRegion只会分布在一个HRegionServer上,不同的HRegion可以分布在不同的HRegionServer上。
  • HRegion的拆分(split)策略
    • IncreasingToUpperBoundRegionSplitPolicy:默认此策略。根据公式min(r*r*flushSize, maxFileSize)确定split的maxFileSize,其中r为在线region个数,maxFileSize由hbase.hregion.max.filesize指定,默认10G。比如flushSize为128M:
      第一次拆分大小为:min(10G,1*1*128M)=128M
      第二次拆分大小为:min(10G,3*3*128M)=1152M
      第三次拆分大小为:min(10G,5*5*128M)=3200M
      第四次拆分大小为:min(10G,7*7*128M)=6272M
      第五次拆分大小为:min(10G,9*9*128M)=10G
      第五次拆分大小为:min(10G,11*11*128M)=10G
    • ConstantSizeRegionSplitPolicy:仅仅当region大小超过阀值时,才进行拆分。
    • DelimitedKeyPrefixRegionSplitPolicy:保证以分隔符前面的前缀为splitPoint,保证相同RowKey前缀的数据在一个Region中。
    • KeyPrefixRegionSplitPolicy:保证具有相同前缀的row在一个region中(要求设计中前缀具有同样长度)。指定rowkey前缀位数划分region,通过读取table的prefix_split_key_policy.prefix_length属性,该属性为数字类型,表示前缀长度,在进行split时,按此长度对splitPoint进行截取。此种策略比较适合固定前缀的rowkey。当 table中没有设置该属性,或其属性不为Integer类型时,指定此策略效果等同与使用IncreasingToUpperBoundRegionSplitPolicy。
  • 可以定义全局的拆分策略,参数为hbase.regionserver.region.split.policy,也可以在创建和修改表时指定。
  • HRegion由一个或多个HStore组成,每个HStore对应一个ColumnFamily。
  • HStore由一个MemStore与一系列StoreFile组成
    • 单个MemStore的最大默认为128M,达到这个值后便会触发flush动作。通过hbase.hregion.memstore.flush.size设置。
    • hbase.regionserver.global.memstore.upperLimit:默认值为0.4。这个参数的作用是防止内存占用过大,当ReigonServer内所有人region的memstores所占用内存总和达到heap的40%时,HBase会强制block所有的更新并flush所有memstores,以释放内存。
    • hbase.regionserver.global.memstore.lowerLimit:默认值为0.35。和上一个参数类似,区别是所占用内存达到35%时,只flush占用内存最大的一个region包含的memstores,同样会block所有的更新。此操作可视为flush所有memstores之前的补救措施。
    • 每一次Memstore的flush,会为同Region下每一个CF创建一个新的HFile,即为每个HStore产生一个StoreFile,同时释放此region的内存占用。
    • hbase.hstore.blockingStoreFiles:默认为10,Store允许含有的StoreFile文件数量。在flush前,会先判断StoreFile数量,超过此值则进行split&compact动作。flush完成后也会判断是否要做split&compact动作。
  • Hbase Compaction主要作用为合并文件,清除已删除、过期、多余版本的数据,提高读写数据的效率。
    • Compation包含Major Compaction和Minor Compaction。
  • Flush是针对一个Region整体执行操作,而Compaction操作是针对Region上的一个Store而言,因此,从逻辑上看,Flush操作粒度较大。
  • StoreFile以HFile格式保存在HDFS上。
  • HFile的块(Block)大小默认为64KB。
        在HDFS中,文件的默认块(Block)大小为128MB,这是HFile默认块大小的2048倍。因此HBase存储文件的块与Hadoop的块之间没有匹配关系,两种块类型之间没有相关性。HBase把它的文件透明地存储到文件系统中,而HDFS也使用块来切分文件仅仅是一个巧合,并且HDFS不知道HBase存储的是什么,它只能看到二进制文件。
0 0