整个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实现原理及系统架构的更多相关文章

  1. Android入门(二):Android的系统架构

    android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.   从技术方面看,An ...

  2. 【Tomcat】Tomcat原理与系统架构

    目录 版本: 一,目录说明 二,浏览器访问服务器的流程 三,Tomcat系统总体架构 3.1 Tomcat请求的大致流程 3.2 Servlet容器处理请求流程 3.3 Tomcat系统总体架构 四, ...

  3. 消息队列RabbitMQ(二):RabbitMQ的系统架构概述

    前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...

  4. 【Java进阶面试系列之一】哥们,你们的系统架构中为什么要引入消息中间件?

    转: [Java进阶面试系列之一]哥们,你们的系统架构中为什么要引入消息中间件? **这篇文章开始,我们把消息中间件这块高频的面试题给大家说一下,也会涵盖一些MQ中间件常见的技术问题. 这里大家可以关 ...

  5. HBase 学习之路(二)—— HBase系统架构及数据结构

    一.基本概念 一个典型的Hbase Table 表如下: 1.1 Row Key (行键) Row Key是用来检索记录的主键.想要访问HBase Table中的数据,只有以下三种方式: 通过指定的R ...

  6. HBase 系列(二)—— HBase 系统架构及数据结构

    一.基本概念 一个典型的 Hbase Table 表如下: 1.1 Row Key (行键) Row Key 是用来检索记录的主键.想要访问 HBase Table 中的数据,只有以下三种方式: 通过 ...

  7. HBase 系统架构及数据结构

    一.基本概念     2.1 Row Key (行键)     2.2 Column Family(列族)     2.3 Column Qualifier (列限定符)     2.4 Column ...

  8. Hbase 系统架构(zhuan)

    一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...

  9. 列式存储hbase系统架构学习

    一.Hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...

随机推荐

  1. 深入理解JVM线程模型

    1. jvm内存模型在描述jvm线程模型之前,我们先深入的理解下,jvm内存模型.在jvm1.8之前,jvm的逻辑结构和物理结构是对应的.即Jvm在初始化的时候,会为堆(heap),栈(stack), ...

  2. redux 中的 redux-thunk(中间件)

    前言 空闲时间把redux中的redux-thunk中间件回顾下,因为以前没有写博客的习惯,都怪自己太年轻,好了 其实:      redux的核心概念其实很简单:将需要修改的state都存入到sto ...

  3. mysql慢查询分析

    mysql慢查询分析 Posted: 29. 08. 2014 | Author: zdz | Category: mysql MySQL 慢查询日志分析 1. pt-query-digest分析慢查 ...

  4. centos6.5下修改系统的roo用户/非root用户的密码

    1.修改系统root用户的密码 [........~]# passwd然后输入新密码,若提示密码太简单,无需理会,直接敲回车: 然后再次输入新密码,即可修改成功. 2.修改系统非root用户的密码:e ...

  5. 容器"共享"宿主机的hosts文件(终极方案)

    0.背景 有时候制作docker镜像生成容器时需要宿主机的hosts文件共享到容器中.首先想的是通过挂载的方式共享hosts文件,但是实践时发现根本行不通,hosts文件在/etc/目录下,如进行挂载 ...

  6. 【java】并发执行ExecutorService的sumbit返回值的顺序问题

    ArrayList<Future> fl = new ArrayList<Future>(); for (int i = 0; i < 10; i++) { Future ...

  7. 对 Promises/A+ 规范的研究 ------引用

    作为 Modern JavaScript 基础设施的一部分,Promises 对前端开发者而言异常重要.它是 async/await 语法的基础,是 JavaScript 中处理异步的标准形式.并且, ...

  8. php大文件分片上传插件

    PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...

  9. Kotlin使用率达35%,Java要退位了?

    在今年的Google I/O大会上,关于Kotlin,Google只说了只言片语: 在过去一年里,有35%的专业Android开发者在使用Kotlin,其中95%的开发者都对Kotlin非常满意. 之 ...

  10. html caption标签 语法

    html caption标签 语法 caption是什么标签? 作用:定义表格标题. 说明:caption 标签必须紧随 table 标签之后.您只能对每个表格定义一个标题.通常这个标题会被居中于表格 ...