image.png
所以可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系

cell

{row key,column(=<family> +<qualifier>),version}唯一确定的单元
一般get出来的为最新版本,也可以指定get 'me','weihongrao',{COLUMNS=>['f1:age','f1:home'],VERSIONS=>2}

列簇的特点

1、一张表通常有一单独的列簇,而且一张表中的列簇不会超过5个
2、列簇必须在创建表的时候定义
3、表的列簇无法改变
4、每个列簇中的列数是没有限制的
5、同一列簇下的所有列会保存在一起
6、列在列簇中是有序的
7、列在运行时创建
8、列只有插入后才会存在,空值并不保存

列簇的作用

权限控制、存储以及调优都是在列簇层面进行的
实际应用中,列簇上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列簇、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)

列簇与数据存储

对同一个行键的访问都会落在同样的物理节点上。如果表包含2个列簇,属于两个列簇的文件还是保存在相同的节点上。因此,行键和节点存在一一对应的关系
每一列簇都会保存在自己的文件集合中。在列簇中检索某列是顺序的I/O。从2个列簇中读取数据表示需要读取HDFS中2个不同的文件和块。所有的存储设置都需要在列簇级别指定
Region虽然是分布式操作的最小单元,但并不是存储的最小单元,在region里面,又划分了很多更小的单位进行存储:

  • Region由一个或者多个Store组成,每个Store保存一个ColumnFamily
  • 每个Store又由一个memStore和多个storefile组成
  • memstore存储在内存中,storefile存储的HDFS上

RegionServer 打开一个 region 的时候,会创建一个相应的 HRegion 对象。当这个 HRegion 被打开,他会为每一个表中的每一个列簇创建一个 Store 实例,就像用户之前创建的那样。每一个 Store 实例相应地有一个或者多个 StoreFile 实例,StoreFile 是真正存储数据的文件(HFile)(hdfs系统中对应的目录)

  • 一个Store还会有一个Memstore
  • 每一个HRegionServer中的所有东西会共享一个HLog实例(WAL实例)

hbase table中每个列簇都对应着region中的一个store,在hdfs系统中则对应着一个目录,如果列簇中尚无数据,怎该目录为空,也就是该store下还没有storefile