写流程
- 客户端从ZK获取到存放.META.表的regionserver。
- 客户端从对应的regionserver上获取.META.表的信息。并从获取的信息中,找到写数据对应的regionserver,也就是put请求发送到哪台regionserver上。
- 客户端找到对应的regionserver,先将对数据的操作写入到HLog中,做预写日志。
- 再去region中,将数据写入到MemStore中,这个时候RegionServer就会给客户端返回ack,当MemStore中的数据到达阈值时,就将它的数据写入到缓冲队列,由缓冲队列写入到HFile中。
- HFile会将小文件进行合并,防止文件存放到HDFS上时,namenode上的元数据过于臃肿。它也会将过大的文件进行拆分。
读流程
.META.:存放region信息,表的名字,rowkey的范围,region在哪个regionserver
-ROOT-:存放的是.META.表的信息
- 客户端从zk获取.META.表所在的regionserver。
0.98之前,.META.的相关信息存放在-ROOT-表中,-ROOT-表存放的位置信息放在ZK中。
0.98之后,没有-ROOT-表了,ZK中直接存放.META.表所在的位置信息。
- 去对应的regionserver读取.META.表,获取region所在信息(region在哪个regionserver上保存的信息)。
- 客户端到了regionserver时,先找到region,先去在Block Cache(读缓存)中读取数据,如果读取到了数据就返回。
BlockCache是读缓冲,BlockCache中存放的是客户端最近读取的数据,使用LRU(最近最少使用)算法,它会定期删除里面的数据,先删除访问频率少的数据,如果访问频率一样,那就删除先进来的数据。
- 如果在Block Cache中没读取到数据,就去MemStore 和 Store File(HFile)中查询目标数据,并将Store File中的数据先写入Block Cache,将Block Cache和MemStore中查到的所有数据进行合并,返回时间戳最大的数据。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
- 将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到Block Cache。
- 将合并后的最终结果返回给客户端。
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个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize, 该 Region 就会进行拆分(0.94 版本之前)。默认是10G。
- 当 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。