大数据技术之HBase原理与实战归纳分享-中( 三 )

  • 首先访问 zookeeper , 获取 hbase:meta 表位于哪个 Region Server;
  • 访问对应的 Region Server,获取 hbase:meta 表,将其缓存到连接中,作为连接属性 MetaCache,由于 Meta 表格具有一定的数据量,导致了创建连接比较慢; 之后使用创建的连接获取 Table,这是一个轻量级的连接,只有在第一次创建的时候会检查表格是否存在访问 RegionServer , 之后在获取 Table 时不会访问 RegionServer;
  • 创建 Table 对象发送 get 请求 。
  • 优先访问 Block Cache,查找是否之前读取过,并且可以读取 HFile 的索引信息和布隆过滤器 。
  • 不管读缓存中是否已经有数据了(可能已经过期了),都需要再次读取写缓存和store 中的文件 。
  • 最终将所有读取到的数据合并版本,按照 get 的要求返回即可 。
  • 合并读取数据优化,每次读取数据都需要读取三个位置,最后进行版本的合并 。效率会非常低,所有系统需要对此优化 。
    • HFile 带有索引文件 , 读取对应 RowKey 数据会比较快 。
    • Block Cache 会缓存之前读取的内容和元数据信息,如果 HFile 没有发生变化(记录在 HFile 尾信息中),则不需要再次读取 。
    • 使用布隆过滤器能够快速过滤当前 HFile 不存在需要读取的 RowKey,从而避免读取文件 。(布隆过滤器使用 HASH 算法 , 不是绝对准确的,出错会造成多扫描一个文件,对读取数据结果没有影响)
    文件合并StoreFile Compaction也即是文件合并 , 由于 memstore 每次刷写都会生成一个新的 HFile , 文件过多读取不方便 , 所以会进行文件的合并,清理掉过期和删除的数据 , 会进行 StoreFile Compaction 。
    Compaction 分为两种,分别是 Minor Compaction 和 Major Compaction 。MinorCompaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile , 并清理掉部分过期和删除的数据,有系统使用一组参数自动控制,Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile , 并且会清理掉所有过期和删除的数据,由参数 hbase.hregion.majorcompaction控制,默认 7 天 。
    大数据技术之HBase原理与实战归纳分享-中

    文章插图
    • Minor Compaction 控制机制:参与到小合并的文件需要通过参数计算得到 , 有效的参数有 5 个
      • hbase.hstore.compaction.ratio(默认 1.2F)合并文件选择算法中使用的比率 。
      • hbase.hstore.compaction.min(默认 3) 为 Minor Compaction 的最少文件个数 。
      • hbase.hstore.compaction.max(默认 10) 为 Minor Compaction 最大文件个数 。
      • hbase.hstore.compaction.min.size(默认 128M)为单个 Hfile 文件大小最小值,小于这个数会被合并 。
      • hbase.hstore.compaction.max.size(默认 Long.MAX_VALUE)为单个 Hfile 文件大小最大值,高于这个数不会被合并 。小合并机制为拉取整个 store 中的所有文件,做成一个集合 。之后按照从旧到新的顺序遍历 。
    • 判断条件为:
      • 过小合并,过大不合并 。
      • 文件大小/ hbase.hstore.compaction.ratio < (剩余文件大小和) 则参与压缩 。所有把比值设置过大,如 10 会最终合并为 1 个特别大的文件,相反设置为 0.4,会最终产生 4 个 storeFile 。不建议修改默认值 。
      • 满足压缩条件的文件个数达不到个数要求(3 <= count <= 10)则不压缩 。
    分区Region Split也即是分区,Region 切分分为两种,创建表格时候的预分区即自定义分区 , 同时系统默认还会启动一个切分规则,避免单个 Region 中的数据量太大 。
    • 自定义分区:每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的rowKey 范围,则该数据交给这个 region 维护 。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能 。
    # 手动设定预分区create 'student1','info', SPLITS => ['1000','2000','3000','4000']# 生成 16 进制序列预分区create 'student2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}# 按照文件中设置的规则预分区,创建 student-splits.txt 文件内容如下:aaaabbbbccccdddd# 然后执行:create 'student3', 'info',SPLITS_FILE => 'student-splits.txt'
    大数据技术之HBase原理与实战归纳分享-中

    文章插图