1)当数据块达到 4 块,Hmaster 触发合并操作,Region 将数据块加载到本地,进行合并;
2)当合并的数据超过 256M,进行拆分,将拆分后的 Region 分配给不同的 HregionServer管理(一个表中的region就会被不同的HRegionServer管理,分布式存储,高可用容灾);
3)当 HregionServer 宕机后,将 HregionServer 上的 hlog 拆分,然后分配给不同的 HregionServer加载,修改.META.;
4)注意:HLog 会同步到 HDFS。
memstore每次刷写都会生成一个新的HFile,且同一个数据({namespace:table,rowkey,column family:column}相同)的不同版本(timestamp)和不同类型的(put/delete)有可能会分布在不同的HFile中,所以查询时需要遍历所有的HFile。为了减少HFile的个数,以及清理掉过期和最后版本是(delete)的数据,会进行StoreFile Compaction合。StoreFile Compaction分为Minor Compaction和Major Compaction,前者Minor将邻近的若干个HFile合并成一个较大的HFile,但不会清理过期和删除的数据;后者Major将一个Store下的所有HFile合并成一个大的HFile,并且会清理掉过期和删除的数据。
【附录】
META是啥?
META是一种思想概念,一种抽象思维,用来描述数据的数据,比如有一张学生表,记录着学生的基本信息,我们通过表可以获取学生信息(数据),但是有时候也要得到表本身的信息数据(比如表结构信息:字段名称,字段数据类型,长度等信息),对于这种基础信息的描述,就会使用META的概念,使用META元数据来描述表本身。放到HTML中也是一样的,HTML用来描述网页信息,但是HTML自己也有一些信息(比如网页标题,网页描述,搜索关键字),这些信息也就称之为HTML META信息,并且HTML也定义了专门的META标签。
列族是如何进行动态扩展的?
一个列族中的所有列是保存在同一个文件的(多了会分region),当有新的列族时,在一个新的文件中存储新的列族。某keyrow如果在这个列族中有相应的列的信息,则新文件中存储rowkey和列信息,没有的话不存储(而不是null值)。
HBase的检索支持3种方式:
(1) 通过单个Rowkey访问,即按照某个Rowkey键值进行get操作,这样获取唯一一条记录;
(2) 通过Rowkey的range进行scan,即通过设置startRowKey和endRowKey,在这个范围内进行扫描。这样可以按指定的条件获取一批记录;
(3) 全表扫描,即直接扫描整张表中所有行记录。
注:由于row key默认按照字典顺序升序排序,按照row key检索的效率很高
为什么不建议用多个列族?
一个列族就对应一个store,当一个表中有多个列族时,这个表拆分后的一个Region中就会有多个Store文件。如果在一些Region中有大量的数据(存着那个列族中的列的数据),而剩下的Region仅有少量的数据,那么就会生成多个的小文件。当查询rowkey的数据时,会找到某个Region,然后在那个Region中需要扫描所有的Store中的文件(有多少个列族就有多少个Store)造成效率低。当使用多个列族时,需要每个列族中的列的数据的量差不多。