hbase's architecture overview:
note:
* why hbase use zookeeper but hadoop?
hbase use zk to implements the heartbeat mechanism ,and hadoop use build-in heartbeat to detect node states and assign tasks;of course this will simly the code complexcity and decouple easily.
* HMaster从不进行选举
虽然hbase使用了zookeeper,但这只是利用了zk的其中一些特点:高可用性,作用协调器的特点,但这并不意味当它失效后会再次进行选举,这与hadoop中的NameNode不参与选举是一样的。
*自动分区
当表的大小超过表的指定阀值时,hbase会自动的将表横向切分为多个regions,所以一个HRegionServer会存储一个表的多个某个shard;当然,如果有多个表,这意味着可能一个RS同时存储多个shards。
*自动扩展
加入 一个region server node后,再运行regionserver.sh(really?),将会使用regions 中的shards 再次balance,也就是说负载会自动分布。这点与hdfs是类似的。
*容错性
因为一个table将被 分成多个regions,所以如果 其中一个rs失效后,只会影响表中的部分数据,降低了每个rs的重要性。可以说hbase没有spare功能 ;但由于hdfs中的每个Node都 是存放其中一个replication,所以这个问题在hdfs中是不会出现 的。
*hbase与database的区别
1.hbase中的cell 是有版本 的
2.hbase中的row是按字典顺序已经排序的。
3.hbase中的column只要已经定义family,是可以动态添加的(add on the fly),但删除时只能对family删除,即columns会被全部删除,see 初探之三(小结)
4.hbase中没有多表的join功能,但由于它是适用于sparse(not spare)存储的,所以可以转变一下:
将一个row存储为多表join的情况.
5.hbase支持指定column排序吗?
目前版本是不支持的。
不过如果排序fields不多,可以变相地实现:
利用row key已排序的特点,即将相应 的filed value append to row key.
不过目前已经有了几种解决方法:
1.使用secondary index机制
2.使用mapred来计算
see:
http://stackoverflow.com/questions/2516857/hbase-schema-design-to-make-sorting-easy
https://github.com/ykulbak/ihbase
支持条件过滤吗?
可以的。当使用getScanner(scan)时,其中的scan就可以指定,发现filter package有丰富的相关实现,如RowFilter(filter by row key),ValueFilter(filter by column cell value)...
其实它是在每个rs中建立一个instance of filter来实现的。
6.hbase只支持行级事务,不支持表级以上的事务处理。
-----------------
*数据模型
conceptual(logical)view
row key | time stamp(version) | column family "info" | column family "intcol" |
1 | v5 | "info:nation"=china | |
1 | v4 | "info:name"=lili | "intcol:age"=23 |
1 | v2 | "info:name"=lila | |
1 | v2 | "intcol:age"=22 | |
1 | v1 | "intcol:age"=20 |
从上图可以看出,在v2时修改了二个column (qualifier) values,但这并不表示是同时修改,只不过它们刚好在版本上是重叠。
physical view:
row key | time stamp | column family "info" |
1 | v5 | "info:nation"=china |
1 | v4 | "info:name"=lili |
1 | v2 | "info:name"=lila |
row key | time stamp | column falimy "intcol" |
1 | v4 | "intcol:age"=23 |
1 | v2 | "intcol:age"=22 |
1 | v1 | "intcol:age"=20 |
注意:以上版本并不一定是顺序的,比如可以删除指定版本的cell。
当然,如果 现在查询row key =1的记录并没有指定版本号时,得到如下結果:
row key | info:nation | info:name | intcol:age |
1 | china | lili | 23 |
即获得的是各cells最新版本的values
所以说hbase是”先横向拆分,再纵向存储“,即每个RS都 是以column的方式进行存储的;并且每个rs中的sub table都 应该是独立存储的,互不干扰。
这点类似于hive里的RCFile吧?
* 写入流程
*读取流程
*为什么可以随机读写,实时访问?
1.Hbase中每个文件从集群启动开始 一直保持打开 状态 ,这样一来减少了每次访问时打开文件的时间开销;但这样当然 引起 了另外一个问题:文件打开数过多。其中默认是ulimit=1024
2.
see also:hbase cluster installation -notes
http://hbase.apache.org/book.html#datamodel