hbase建表
在hbase中的表,表大小可以使10亿行和数百万个列,存储量是其他任何radbms无法比拟的,查询更新等待时间并丝毫不比radbms慢,反而会快的很多。当然缺点也是很明显的,不能做跨行事务,不能做关联查询,不能建立二级索引。
hbase设计如此大的表,当然不是单台机器能够存储得了的,一般会分布存储在多个datanode上。首先一张表会有多个column family,每个column family会有多个HFile,即如何将这些HFile分配到多个节点上:
HFile会分成多个region到不同的节点上,托管region的节点,称为regionServer,regionServer 本质上是hdfs客户端,通过hdfs存储/访问真实数据(block)。可以粗略理解,region这套体系照搬了hdfs的策略,最终又调用了hdfs用户存放真实数据,regionServer类似metadata。
一个regionserver可以托管多个region,单个region大小由参数HBase.hregion,max.filesize配置,当region增大多于该阀值时,会拆分成2个region.
如何找到region:
在hbase中有两个特殊的表-ROOT表和.META表,用来记录查找各个region在哪里,-ROOT和.META表也会像其他表一样拆分成region。但是-ROOT永远只有一个region。
从图中的数据指示可以推断:
如果要找到region3,首先-ROOT下匹配rowkey,就知道在.meta2 ,.meta2在机器RegionServer1上,进入regionServer1上的.meta2表就查到了region3在 regionServer2机器上。
-ROOT表在哪?
而客户端要和hbase交互首先要和zk交互,和hdfs的区别?zk下hbase节点记录了-ROOT表在哪台regionserver上,然后继续上面的流程。
获取得知-ROOT在哪 (2个步凑)
获取.meta在哪(2个步凑)
获取region在哪 (2个步凑)
获取region数据(2个步凑)
数据建模
在twiter系统中,需要记录用户关注其他用户所用的帖子
在关系型数据表中,可能需要新建一个关注表表即可。
在hbase如何设计rowkey呢,如果只适用userID,必然只会一个careList列族,当新增一个关注时,column怎么处理,是需要增加一个column吗,最后搞得一个column family下有多少column都不知道了[宽表设计]。如果row key = userID + "-cared-" +userID,每新增一个关注操作就插入一行,取消就删除一行,column family只需要有1~2个列就够了,如各自的名称,创建时间等[高表设计]。
在hbase设计领域尽可能使用高表设计。
行健长度,可是使用MD5加密等到定长的主键。并得到散列主键,避免访问热点。