minor 合并负责重写最后生成的几个文件到一个更大的文件中。文件数量是由hbase.hstore.compaction.min 属性设置的。它的默认值为 3,并且最小值需要大于或等于 2。过大的数字将会延迟 minor 合并的执行,同时也会增加执行时消耗的资源及执行的时间 。
major 合并:它们把所有文件压缩成一个单独的文件。默认情况下,major 合并间隔是7 天,看情况随机的加上或减去 4.8 小时。如果要删除数据,不会直接修改 storefile,因为 hadoop 不允许修改。hbase 会将删除的数据标志为已删除(给该数据添加墓碑标记),如果添加了墓碑标记,查询不到该数据。在大合并的时候,将标记了墓碑标记的数据真正删除。
当用户向 HRegionServer 发起 HTable.put(Put)请求时,其会将请求交给对应的
HRegion 实例来处理。
第一步是要决定数据是否需要写到由 HLog 类实现的预写日志中。WAL 是标准的Hadoop SequenceFile,并且存储了 HLogKey 实例。这些键包括序列号和实际数据,所以在服务器崩溃时可以回滚还没有持久化的数据。
一旦数据被写入到 WAL 中,数据就会被放到 MemStore 中。同时还会检查 MemStore是否已经满了,如果满了,就会被请求刷写到磁盘中去。刷写请求由另外一个HRegionServer 的线程处理,它会把数据写成 HDFS 中的一个新 HFile。同时也会保存最后写入的序号,系统就知道哪些数据现在被持久化了。
- Client 访问 Zookeeper,查找 hbase:meta 表位置,看他在哪个 regionserverR 上。
- Client 访问 regionserverR 上 hbase:meta 表中的数据,查找要操作 rowkey 的所在
表对应 region 所在的 regionserverX - Client 读取 regionserverX 上的 region 数据
定位到真正的数据所在的 region 的时候,按照下述步骤进行操作:
先查找 memstore,如果 memstore 没有,查找 blockcache;如果 blockcache
没有,则查找 storefile 的数据,同时将数据缓存与 blockcache 中。



