设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 2352|回复: 5
打印 上一主题 下一主题

hbase 系统架构 [复制链接]

Rank: 8Rank: 8

跳转到指定楼层
1#
那个谁 发表于 2012-1-8 13:32:48 |只看该作者 |倒序浏览



Client


1 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息。


Zookeeper


1 保证任何时候,集群中只有一个master


2 存贮所有Region的寻址入口。


3 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master


4 存储Hbase的schema,包括有哪些table,每个table有哪些column family


Master


1 为Region server分配region


2 负责region server的负载均衡


3 发现失效的region server并重新分配其上的region


4 GFS上的垃圾文件回收


5 处理schema更新请求


Region Server


1 Region server维护Master分配给它的region,处理对这些region的IO请求


2 Region server负责切分在运行过程中变得过大的region


可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低。


关键算法/流程

region定位


系统如何找到某个row key (或者某个 row key range)所在的region


bigtable 使用三层类似B+树的结构来保存region位置。


第一层是保存zookeeper里面的文件,它持有root region的位置。


第二层root region是.META.表的第一个region其中保存了.META.z表其它region的位置。通过root region,我们就可以访问.META.表的数据。


.META.是第三层,它是一个特殊的表,保存了hbase中所有数据表的region 位置信息。


说明:


1 root region永远不会被split,保证了最需要三次跳转,就能定位到任意region 。


2.META.表每行保存一个region的位置信息,row key 采用表名+表的最后一样编码而成。


3 为了加快访问,.META.表的全部region都保存在内存中。


假设,.META.表的一行在内存中大约占用1KB。并且每个region限制为128MB。


那么上面的三层结构可以保存的region数目为:


(128MB/1KB) * (128MB/1KB) = = 2(34)个region


4 client会将查询过的位置信息保存缓存起来,缓存不会主动失效,因此如果client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的region(其中三次用来发现缓存失效,另外三次用来获取位置信息)。


读写过程


上文提到,hbase使用MemStore和StoreFile存储对表的更新。


数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了。(minor compact)


当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。


前面提到过StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对StoreFile进行split,等分为两个StoreFile。


由于对表的更新是不断追加的,处理读请求时,需要访问Store中全部的StoreFile和MemStore,将他们的按照row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快。


写请求处理过程


1 client向region server提交写请求


2 region server找到目标region


3 region检查数据是否与schema一致


4 如果客户端没有指定版本,则获取当前系统时间作为数据版本


5 将更新写入WAL log


6 将更新写入Memstore


7 判断Memstore的是否需要flush为Store文件。


region分配


任何时刻,一个region只能分配给一个region server。master记录了当前有哪些可用的region server。以及当前哪些region分配给了哪些region server,哪些region还没有分配。当存在未分配的region,并且有一个region server上有可用空间时,master就给这个region server发送一个装载请求,把region分配给这个region server。region server得到请求后,就开始对此region提供服务。


region server上线


master使用zookeeper来跟踪region server状态。当某个region server启动时,会首先在zookeeper上的server目录下建立代表自己的文件,并获得该文件的独占锁。由于master订阅了server目录上的变更消息,当server目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此一旦region server上线,master能马上得到消息。


region server下线


当region server下线时,它和zookeeper的会话断开,zookeeper而自动释放代表这台server的文件上的独占锁。而master不断轮询server目录下文件的锁状态。如果master发现某个region server丢失了它自己的独占锁,(或者master连续几次和region server通信都无法成功),master就是尝试去获取代表这个region server的读写锁,一旦获取成功,就可以确定:


1 region server和zookeeper之间的网络断开了。


2 region server挂了。


的其中一种情况发生了,无论哪种情况,region server都无法继续为它的region提供服务了,此时master会删除server目录下代表这台region server的文件,并将这台region server的region分配给其它还活着的同志。


如果网络短暂出现问题导致region server丢失了它的锁,那么region server重新连接到zookeeper之后,只要代表它的文件还在,它就会不断尝试获取这个文件上的锁,一旦获取到了,就可以继续提供服务。


master上线


master启动进行以下步骤:


1 从zookeeper上获取唯一一个代码master的锁,用来阻止其它master成为master。


2 扫描zookeeper上的server目录,获得当前可用的region server列表。


3 和2中的每个region server通信,获得当前已分配的region和region server的对应关系。


4 扫描.META.region的集合,计算得到当前还未分配的region,将他们放入待分配region列表。


master下线


由于master只维护表和region的元数据,而不参与表数据IO的过程,master下线仅导致所有元数据的修改被冻结(无法创建删除表,无法修改表的schema,无法进行region的负载均衡,无法处理region上下线,无法进行region的合并,唯一例外的是region的split可以正常进行,因为只有region server参与),表的数据读写还可以正常进行。因此master下线短时间内对整个hbase集群没有影响。从上线过程可以看到,master保存的信息全是可以冗余信息(都可以从系统其它地方收集到或者计算出来),因此,一般hbase集群中总是有一个master在提供服务,还有一个以上的’master’在等待时机抢占它的位置。


访问接口
•HBase Shell
•Java clietn API

HBase non-java access


languages talking to the JVM

•Jython interface to HBase
•Groovy DSL for HBase
•Scala interface to HBase


languages with a custom protocol

•REST gateway specification for HBase
•充分利用HTTP协议:GET POST PUT DELET
•text/plain
•text/xml
•application/json
•application/x-protobuf


Thrift gateway specification for HBase

•java
•cpp
•rb
•py
•perl
•php


•HBase Map Reduce
•Hive/Pig

结语:

全文对Hbase做了简单的介绍,有错误之处,敬请指正。未来将结合Hbase在淘宝数据平台的应用场景,在更多细节上进行深入。


参考文档

Bigtable: A Distributed Storage System for Structured Data


HFile: A Block-Indexed File Format to Store Sorted Key-Value Pairs for a thorough introduction Hbase Architecture 101


Hbase source code
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

Rank: 8Rank: 8

2#
那个谁 发表于 2012-1-8 13:33:06 |只看该作者
第四张图引用自HBase Architecture 101 – Write-ahead-Log
根据habse0.90代码,HLog是每个region server一个,不是每个region一个,因此这张图是错的,文中没有写错。
这样做是为了提高hbase的写性能,在Google Big Table论文中有详细描述:
Commit-log implementation
If we kept the commit log for each tablet in a separate
log le, a very large number of les would be written
concurrently in GFS. Depending on the underlying le
system implementation on each GFS server, these writes
could cause a large number of disk seeks to write to the
different physical log les. In addition, having separate
log les per tablet also reduces the effectiveness of the
group commit optimization, since groups would tend to
be smaller. To x these issues, we append mutations
to a single commit log per tablet server, co-mingling
mutations for different tablets in the same physical log
le [18, 20].
如果一个region server意外失效,在恢复其上的数据时,会先将Hlog按照region进行切分,在分发到未这些region提供服务的机器上去。

使用道具 举报

Rank: 8Rank: 8

3#
那个谁 发表于 2012-1-8 13:34:12 |只看该作者
本帖最后由 那个谁 于 2012-1-8 13:34 编辑

.META.表每行保存一个region的位置信息,这个是没有错,我那天在hbase里删除了一些数据,但是发现在HDFS上仍然存在,而且,在.META.表下面又出现了一个historian 它下面记录着已经被删除的一些记录。可是它并没有删除HDFS上的这些数据,这样,HDFS就会存在很多无意义的数据了。这是hbase的一个BUG呢?还是有其它的什么设置?

  hbase的删除操作是不会立即删除实际数据的,而是在compaction发生的时候才会实际删除数据,在执行get或scan操作的时候,hbase实际上是将数据取出后看是否该row存在删除操作,合并了这些操作后,被你删除的数据,在HDFS上虽然还存在,但实际上你是无法get到的。在compaction之后,这些数据将会彻底消失。

使用道具 举报

Rank: 8Rank: 8

4#
那个谁 发表于 2012-1-8 13:35:25 |只看该作者
hbase一张表保存多少条记录量左右不会使性能下降重?如果每天几亿条的数据往一张表里塞,到最后会不会跑不了了?

使用道具 举报

Rank: 1

5#
man2601010 发表于 2013-1-9 10:56:33 |只看该作者
厉害。。高手。。学习中。。。  我在学hbase

使用道具 举报

Rank: 8Rank: 8

6#
那个谁 发表于 2013-1-22 14:43:46 |只看该作者
man2601010 发表于 2013-1-9 10:56
厉害。。高手。。学习中。。。  我在学hbase

亲!我是大菜鸟!

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-5-19 11:10 , Processed in 1.076108 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部