【HBase】二、HBase实现原理及系统架构
整个Hadoop生态中大量使用了master-slave的主从式架构,如同HDFS中的namenode和datanode,MapReduce中的JobTracker和TaskTracker,YARN中的资源管理器和节点管理器,Zookeeper中的leader和follower。我们将看到HBase同样是基于这种主从式的一种运行机制。
1、HBase实现原理
正如前面所说,HBase将表水平分裂为区域,集群中的每个节点管理若干个区域,区域是HBase集群上分布数据的最小单位,因此存储数据的节点就构成了一个个的区域服务器,叫做RegionServer。
在HBase中,同样采用了主从式的架构,用一个master节点协调管理多个RegionServer从属机,主控机负责启动安装,将区域分配给注册的RegionServer,恢复RegionServer的故障,管理和维护HBase表的分区信息,master 的负载很轻。而区域服务器RegionServer负责存储和维护分配给自己的Region,响应客户端的读写请求。
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据,因此主控机的负载很轻。
那么这里我们需要理清的一个重要问题就是如何定位区域在哪个服务器上,即Region的定位问题。
【Region是如何定位的?】
在HBase内部维护了一张名为hbase:meta的特殊目录表,这张表记录了当前集群上所有区域的列表、状态和位置,这张表的行键是区域名,即meta表的结构是:<区域名,位置,状态>,而区域名是由所属表名,区域的起始行,创建时间以及对前三者进行MD5哈希之后的结果共同组成的。
如表TestTable中起始行为xyz的区域的名称是:TestTable,xyz,1279729913622,1b6e176fb8.........(哈希值)
有了meta这张表,表是根据行键排序的,所以要查询某一行只需要与行键进行比较,即可得到对应的区域,进而得到对应的位置,然后直接到那个服务器上去读取数据。
更进一步,我们考虑这样的问题:meta表保存着所以区域的位置信息,因此这张表是很重要的,而且当数据量很大,区域很多时,这张表也可能大到一个区域无法保存,因此HBase实际上是有一个三层结构来完成区域定位的。
理解这个三层结构可以类别文件系统的多级索引机制,首先在Zookeeper中用一个文件保存Root表的位置,Root表中记录meta表的区域位置信息,meta表中记录数据的区域位置。
| 层次 | 名称 | 作用 |
|---|---|---|
| 第一层 | Zookeeper文件 | 记录了-ROOT-表的位置信息 |
| 第二层 | -ROOT-表 | 记录了.META.表的Region位置信息 -ROOT-表只能有一个Region通过-ROOT-表,就可以访问.META.表中的数据 |
| 第三层 | .META.表 | 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息 |
至此,我们就可以完全理解HBase的运行机制了,客户端首先连接到Zookeeper集群,进而通过三级索引查找到hbase:meta表的位置,通过查meta表就可以获取数据区域所在的节点及位置,然后直接和管理那个区域的regionServer交互,进行数据的读写。
总结起来,我们可以看到每个行操作可能需要三次远程访问,一次是连接Root所在节点,一次是连接meta所在节点,还有一次是连接需要的RegionServer,为了节省这些开销,客户端可以通过缓存来存储之前访问meta表得到的信息,这样,后续可以现在缓存中查找,节省多次远程访问的开销。
2、HBase系统架构
实际上通过前面的实现原理,我们对HBase已经基本了解,再来从整体的角度理解其系统的架构。
如图所示,HBase的整体系统架构如图所示,其中包含了客户端、Zookeeper、Master、RegionServer、HDFS这些基本实体。我们来做一个总结:
客户端:客户端包含访问HBase的接口,同时在缓存中维护着已经访问过的Region位置信息,用来加快后续数据访问过程。
Zookeeper服务器:HBase依赖于Zookeeper,它管理一个Zookeeper实例,作为集群的权威机构,之前我们看到root表的位置信息保存在Zookeeper服务器上,客户端通过Zookeeper才可以得到meta目录表的位置以及主控机的地址等信息,也就是说Zookeeper是整个HBase集群的注册机构,另外,Zookeeper可以帮助选举出一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的“单点失效”问题。
主控机Master:主服务器Master主要负责表和Region的管理工作:管理用户对表的增加、删除、修改、查询等操作、实现不同Region服务器之间的负载均衡、在Region分裂或合并后,负责重新调整Region的分布、对发生故障失效的Region服务器上的Region进行迁移等。
Region服务器:Region服务器是HBase中最核心的模块,负责维护分配给自己的Region,并响应用户的读写请求。
HDFS:我们在一开始提到:HBase是基于HDFS开发的,也提到过一个列族的数据在磁盘上作为一个文件存储在一起,这里实际就是使用HDFS来持久化存储数据,是实际的数据存储的地方。
【HBase】二、HBase实现原理及系统架构的更多相关文章
- Android入门(二):Android的系统架构
android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层. 从技术方面看,An ...
- 【Tomcat】Tomcat原理与系统架构
目录 版本: 一,目录说明 二,浏览器访问服务器的流程 三,Tomcat系统总体架构 3.1 Tomcat请求的大致流程 3.2 Servlet容器处理请求流程 3.3 Tomcat系统总体架构 四, ...
- 消息队列RabbitMQ(二):RabbitMQ的系统架构概述
前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...
- 【Java进阶面试系列之一】哥们,你们的系统架构中为什么要引入消息中间件?
转: [Java进阶面试系列之一]哥们,你们的系统架构中为什么要引入消息中间件? **这篇文章开始,我们把消息中间件这块高频的面试题给大家说一下,也会涵盖一些MQ中间件常见的技术问题. 这里大家可以关 ...
- HBase 学习之路(二)—— HBase系统架构及数据结构
一.基本概念 一个典型的Hbase Table 表如下: 1.1 Row Key (行键) Row Key是用来检索记录的主键.想要访问HBase Table中的数据,只有以下三种方式: 通过指定的R ...
- HBase 系列(二)—— HBase 系统架构及数据结构
一.基本概念 一个典型的 Hbase Table 表如下: 1.1 Row Key (行键) Row Key 是用来检索记录的主键.想要访问 HBase Table 中的数据,只有以下三种方式: 通过 ...
- HBase 系统架构及数据结构
一.基本概念 2.1 Row Key (行键) 2.2 Column Family(列族) 2.3 Column Qualifier (列限定符) 2.4 Column ...
- Hbase 系统架构(zhuan)
一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...
- 列式存储hbase系统架构学习
一.Hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...
随机推荐
- 由于代码环境有dev test prod ,每次提交代码需要很多环境,shell脚本即可解决重复命令问题
在项目外面写入push.sh 内容为 if [ $1!='' ] then msg=$1; else msg='bug'; fi git add . git commit -m $ ...
- python 面向对象_2
self的理解 通俗理解self就是实例对象,实例化的是什么,self就是什么 实例变量: 经过实例化才能使用的变量 class Person(): def __init__(self,id,name ...
- toJSON() 方法,将 Date 对象转换为字符串,并格式化为 JSON 数据格式。
JavaScript toJSON() 方法 定义和用法 toJSON() 方法可以将 Date 对象转换为字符串,并格式化为 JSON 数据格式. JSON 数据用同样的格式就像x ISO-8601 ...
- sql 查询 某字段是否重复
select count(*) from ( select * from 客户 )C GROUP BY 客户编码 select * from ( select count(*)num from ( s ...
- Linux入门培训教程 linux系统中文件I/O教程
linux 文件I/O教程 一,文件描述符 对内核而言,所以打开的文件都通过文件描述符引用.每个进程都有一些与之关联的文件描述符.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向 ...
- java+web+超大文件上传
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- Android处理未捕获的异常(应用全局异常)
public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance ...
- 南京网络赛 E K Sum
K Sum 终于过了这玩意啊啊啊==== 莫比乌斯反演,杜教筛,各种分块,积性函数怎么线性递推还很迷==,得继续研究研究 #include<bits/stdc++.h> using nam ...
- C++二维数组(指针)做参数
一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在 ...
- 测试常用命令之awk篇
awk/gawk 1,内置变量 FILENAME:输入文件名称 FNR:当前数据文件中的数据行数 NF:数据文件中的字段总数 NR:已处理的输入数据行数目 FS:输入数据段分隔符 RS:输入数据行分隔 ...