HBase学习笔记

架构简介

HBase与Hadoop类似,采用的是master-slave架构模式,由master和多个regionserver组成。

HBase使用zookeeper作为协同服务组件,保存regionserver的地址,跟踪集群的状态变化等。

master负责region分配、schema更新请求及负载均衡。regionserver负责处理用户的读写请求,如果启用了WAL(Write-Ahead Log),写请求会先写入到日志中,然后再写入到region中。regionserver中有多个region,每个region负责一部分row key对应的数据请求。

HBase是以文件块来存储数据的,每个文件块默认为64k,多个文件块对应HDFS中的块。


定位region

通过客户端API中的put方法进行数据写入时,需要为Put对象指定row key,那么如何得知row key在哪个region上呢?

HBase有一些系统表,其中-ROOT-和.META.两张表就存放了row key对应region信息。如下图所示,.META.表中记录了每个row key对应的region,由于row key很多,用一张.META.表来存储是不够的,所以.META.个分布在多个regionserver中。关于.META.的分布信息又存储在称做-ROOT-的表中,由于这张表不太可能有太多的数据量,所以一个regionserver存储即可,HBase把存储-ROOT-表的region server(Root Region Server)保存到了zookeeper上。


所以根据row key定位region的步骤为:

(1)客户端访问zookeeper,得到-ROOT-表所在的region server;

(2)访问(1)中的root region server,遍历-ROOT-表,得到该row key对应的.META.表所在的region server,-ROOT-表的key是tablename,startkey,timestamp组成的,类似B+树结构,可以根据startkey得到row key对应的.META.分布在哪台region server上;

(3)访问.META.对应的region server服务器,根据row key得到对应的region.

客户端并不会每次请求都执行以上查询,而是把查询结果缓存起来,master并没有参与定位region,这个过程不会造成master单点问题。

数据写入

在定位到了具体的region之后,就由具体的Region实例来处理,首先要决定数据是否要写入到WAL中,如果需要写WAL,则数据写入会先写到HLog中,然后写入内存memstore中。当memstore达到一条大小(默认为5M)后,会被刷入硬盘中。

多个region实例共用一个HLog实例,其核心功能是追加日志,可以通过设置setWwriteToWAL(false)来关闭WAL,如果这样做有可能会导致数据丢失,不建议关闭。

你可能感兴趣的:(hadoop,hbase)