hbase architecture

本文探讨了HBase的数据模型、自动分区、自动扩展、容错性等关键特性,并对比了HBase与传统数据库的区别。同时介绍了HBase如何利用Zookeeper实现心跳机制,以及其在写入和读取流程上的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 keytime 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
1v1"intcol:age"=20

从上图可以看出,在v2时修改了二个column (qualifier) values,但这并不表示是同时修改,只不过它们刚好在版本上是重叠。

 

physical view:

row keytime stampcolumn family "info"
1v5"info:nation"=china
1v4"info:name"=lili
1v2"info:name"=lila

 

row keytime stampcolumn falimy "intcol"
1v4"intcol:age"=23
1v2"intcol:age"=22
1v1"intcol:age"=20


注意:以上版本并不一定是顺序的,比如可以删除指定版本的cell。

当然,如果 现在查询row key =1的记录并没有指定版本号时,得到如下結果:

row keyinfo:nationinfo:nameintcol:age
1chinalili23

即获得的是各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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值