微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HBase深入----读写流程

写流程

在这里插入图片描述

  1. 客户端从ZK获取到存放.Meta.表的regionserver。
  2. 客户端从对应的regionserver上获取.Meta.表的信息。并从获取的信息中,找到写数据对应的regionserver,也就是put请求发送到哪台regionserver上。
  3. 客户端找到对应的regionserver,先将对数据的操作写入到HLog中,做预写日志。
  4. 再去region中,将数据写入到MemStore中,这个时候RegionServer就会给客户端返回ack,当MemStore中的数据到达阈值时,就将它的数据写入到缓冲队列,由缓冲队列写入到HFile中。
  5. HFile会将小文件进行合并,防止文件存放到HDFS上时,namenode上的元数据过于臃肿。它也会将过大的文件进行拆分。

读流程

	.Meta.:存放region信息,表的名字,rowkey的范围,region在哪个regionserver

	-ROOT-:存放的是.Meta.表的信息
  1. 客户端从zk获取.Meta.表所在的regionserver。
    0.98之前,.Meta.的相关信息存放在-ROOT-表中,-ROOT-表存放的位置信息放在ZK中。
    0.98之后,没有-ROOT-表了,ZK中直接存放.Meta.表所在的位置信息。
  2. 去对应的regionserver读取.Meta.表,获取region所在信息(region在哪个regionserver上保存的信息)。
  3. 客户端到了regionserver时,先找到region,先去在Block Cache(读缓存)中读取数据,如果读取到了数据就返回。
    BlockCache是读缓冲,BlockCache中存放的是客户端最近读取的数据,使用LRU(最近最少使用)算法,它会定期删除里面的数据,先删除访问频率少的数据,如果访问频率一样,那就删除先进来的数据。
  4. 如果在Block Cache中没读取到数据,就去MemStore 和 Store File(HFile)中查询目标数据,并将Store File中的数据先写入Block Cache,将Block Cache和MemStore中查到的所有数据进行合并,返回时间戳最大的数据。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
  5. 将从文件查询到的数据块(Block,HFile 数据存储单元,认大小为 64KB)缓存到Block Cache。
  6. 将合并后的最终结果返回给客户端。

StoreFile Compaction

  • 由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)
    和不同类型(Put/Delete)有可能会分布在不同的 HFile 中,因此查询时需要遍历所有的 HFile。为了减少 HFile 的个数,以及清理掉过期和删除的数据,会进行 StoreFile Compaction。
  • Compaction 分为两种,分别是 Minor Compaction 和Major Compaction。Minor Compaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile,但不会清理过期和删除的数据。Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且会清理掉过期和删除的数据。
  • 文件数超过三个时,手动Compact和Major Compact实现的效果是一样的。

    在这里插入图片描述

Region Split

  • 认情况下,每个 Table 起初只有一个 Region,随着数据的不断写入,Region 会自动进行拆分。刚拆分时,两个子 Region 都位于当前的 Region Server,但处于负载均衡的考虑,HMaster 有可能会将某个 Region 转移给其他的 Region Server。
  • Region Split 时机:
    1. 当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize, 该 Region 就会进行拆分(0.94 版本之前)。认是10G。
    2. 当 1 个 region 中 的 某 个 Store 下所有 StoreFile 的 总 大 小 超 过 Min(R^2 * “hbase.hregion.memstore.flush.size”,hbase.hregion.max.filesize"),该 Region 就会进行拆分,其中 R 为当前 Region Server 中属于该 Table 的个数(0.94 版本之后)。
      hbase.hregion.memstore.flush.size认是128M。
      hbase.hregion.max.filesize认是10G。
      R是当前这个表有多少region。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐