就像用MySQL一样,在Mysql中行和列比较容易理解,因为它的表结构和传统的“表”是类似的,一行一行,一列一列。
我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中不再是单列,而主要是Table,Family和Qualifier,这三个概念。
Table易于理解,就是mysql中的表,而Family和Qualifier其实都可以理解为列,一个Family下面可以有多个Qualifier,所以可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系。
而这两级“列”,都不止一列,而是多列的一个集合。比如一个Family可能包含8列,一个Qualifier包含4列等等
那么为什么Hbase不采用单列的设计,而采用这种集合列的设计呢?
其实究其原因,family越多,那么获取每一个cell数据的优势越明显,因为io和网络都减少了,而如果只有一个family,那么每一次读都会读取当前rowkey的所有数据,网络和io上会有一些损失。
除此以外,权限控制、存储以及调优都是在列族层面进行的
实际应用中,列族上的控制权限能 帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因 为隐私的原因不能浏览所有数据)
对于传统关系型数据库中的一张table,在业务转换到hbase上建模时,从性能的角度应该如何设置family和qualifier呢?
最极端的,可以每一列都设置成一个family,也可以只有一个family,但所有列都是其中的一个qualifier,那么有什么区别呢?
family越多,那么获取每一个cell数据的优势越明显,因为io和网络都减少了,而如果只有一个family,那么每一次读都会读取当前rowkey的所有数据,网络和io上会有一些损失。
当然如果要获取的是固定的几列数据,那么把这几列写到一个family中比分别设置family要更好,因为只需一次请求就能拿回所有数据。
不同的family是在同一个region下面。而每一个family都会分配一个memstore,所以更多的family会消耗更多的内存。因此对于写比较多的系统,如果是离线应该,我们尽量只用一个family好了,但如果是在线应用,那还是应该根据应用的情况合理地分配family。