客户端Client

客户端 Client 是整个 HBase 系统的入口。使用者直接通过客户端操作 HBase。客户端

使用 HBase 的 RPC 机制与 HMaster 和 RegionServer进行通信。对于管理类操作,Client 与

HMaster 进行 RPC 通信;对于数据读写类操作,Client 与RegionServer 进行 RPC 交互。这里

客户端可以是多个,并不限定是原生 Java 接口,还有 Thrift、Avro、Rest等客户端模式,甚

至 MapReduce 也可以算作一种客户端。

协调服务组件Zookeeper

ZooKeeper Quorum(队列)负责管理 HBase 中多 HMaster 的选举、服务器之间状态同

步等。再具体一些就是,HBase 中 ZooKeeper 实例负责的协调工作有:存储 HBase 元数据信

息、实时监控 RegionServer、存储所有 Region 的寻址入口,当然还有最常见的功能就是保证

HBase 集群中只有一个HMaster 节点

主节点Hmaster

HMaster 没有单点问题,在HBase 中可以启动多个 HMaster,通过ZooKeeper 的 Master

选举机制保证总有一个 Master 正常运行并提供服务,其他 HMaster 作为备选时刻准备(当目

前 HMaster 出现问题时)提供服务。HMaster 主要负责Table 和 Region 的管理工作:

‰ 管理用户对 Table 的增、删、改、查操作。

‰ 管理 RegionServer 的负载均衡,调整 Region 分布。

‰ 在 Region 分裂后,负责新 Region 的分配。

‰ 在 RegionServer 死机后,负责失效 RegionServer 上的 Region 迁移。

Region 节点 HRegionServer

HRegionServer 主要负责响应用户 I/O 请求,向 HDFS 文件系统中读写数据,是 HBase

中最核心的模块。HRegionServer 内部管理了一系列 HRegion对象,每个 HRegion 对应了

Table 中的一个Region。HRegion 由多个HStore 组成,每个 HStore 对应了Table 中的一个

Column Family 的存储。可以看出每个 Column Family 其实就是一个集中的存储单元,因

此最好将具备共同 I/O 特性的列放在一个 Column Family 中,这样能保证读写的高效性。

HStore 存 储 是 HBase 存 储 的 核 心, 由 两 部 分 组 成:MemStore 和

StoreFile。MemStore是 Sorted Memory Buffer,用户写入的数据首先会放入 MemStore 中,当

MemStore 满了以后会缓冲(flush)成一个 StoreFile(底层实现是 HFile) ,当 StoreFile 文件数

量增长到一定阈值,会触发 Compact 操作,将多个StoreFiles 合并成一个 StoreFile,在合并

过程中会进行版本合并和数据删除,因此可以看出 HBase 其实只有增加数据,所有的更新和

删除操作都是在后续的 Compact 过程中进行的,这使得用户的写操作只要进入内存中就可以

立即返回,保证了 HBase I/O 的高性能。

StoreFiles 在触发 Compact 操作后,会逐步形成越来越大的 StoreFile,当单个StoreFile

大小超过一定阈值后,会触发 Split 操作,同时把当前Region 分裂成 2 个 Region,父 Region

会下线,新分裂的 2 个子 Region 会被HMaster 分配到相应的 HRegionServer 上,使得原先 1

个 Region 的压力得以分流到 2 个 Region 上。

每个 HRegionServer 中都有一个 HLog 对象,HLog 是一个实现 Write Ahead Log 的类,

在每次用户操作写入 MemStore 的同时,也会写一份数据到HLog 文件中,HLog 文件定期

会滚动出新,并删除旧的文件(已持久化到 StoreFile 中的数据) 。在 HRegionServer 意外终

止后,HMaster 会通过 ZooKeeper 感知到,首先处理遗留的 HLog 文件,将其中不同 Region

的 Log 数据进行拆分,分别放到相应 Region 的目录下,然后再将失效的 Region 重新分配,

领取到这些 Region 的 HRegionServer 在加载 Region 的过程中,会发现有历史 HLog 需要处

理,因此会将 HLog 中的数据回放到 MemStore 中,然后缓冲(flush)到 StoreFiles,完成数

据恢复。

HBase核心功能模块--读书笔记的更多相关文章

  1. 二、 HBase核心功能模块。

      Hadoop 框架包含两个核心组件: HDFS 和 MapReduce 其中     HDFS                是文件存储系统,负责数据存储:     MapReduce     是 ...

  2. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  3. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  4. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. Java多线程编程实战指南(核心篇)读书笔记(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  8. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  9. 《python核心编程》--读书笔记 第21章 数据库编程

    准备:今天拿笔记本装了mysql,这样就能在不同地方用其他电脑远程访问同一个数据库了. python安装MySQLdb模块:http://www.codegood.com/downloads. 21. ...

随机推荐

  1. Object-C中对“引用(reference)”的理解

    http://blog.csdn.net/csz0102/article/details/25984275 注:以下讨论都是在ARC模式下 我们在iOS开发中最经常碰到的“引用(reference)” ...

  2. 【php】php与mysql初体验

    第一次体验在web站点上使用MySQL数据库,遇到了很多问题,总结如下: 1.安装XAMPP软件后,将文件放到hotdocs文件夹下,要访问其中的文件,使用localhost/XXX/XXX ,路径要 ...

  3. Loadrunner之HTTP脚本编写

    Loadrunner之HTTP脚本编写 刚学习性能测试的时候还是建议以录制脚本为好,从录制的脚本中去了解脚本结构,各个函数的用法,慢慢再去尝试自己去编写脚本,如果想往技术方向发展,建议最好学习一门编程 ...

  4. 小程序的get和post需要注意的地方

    在进行异步请求之前先去小程序后台配置好服务器域名. get请求:header: { 'content-type':'json'}就可以. post请求:header: { 'content-type' ...

  5. JVM培训之一些GC算法的理论知识

    很精彩的一次内部分享,介绍了大部分的GC算法理论知识,JVM博大精深,本篇文章只是结合本次内部分享总结的一些理论知识,如果有大佬有疑问,欢迎留言指出! Concurrent:并发,程序一边运行一边做G ...

  6. 容易忽略的expect脚本问题,暗藏的僵尸进程,wait命令不要漏掉

    问题描述 前几天有个小需求,用到expect脚本去循环的发送一些数据,主要问题代码如下: #! /usr/bin/expect while {true} { set timeout 60 spawn ...

  7. 从对集合数据去重到Distinct源码分析

    今天在写代码的时候要对数据进行去重,正打算使用Distinct方法的时候,发现这个用了这么久的东西,竟然不知道它是怎么实现的,于是就有了这篇文章. 使用的.net core2.0 1.需求 假如我们有 ...

  8. mybatis的Mapper.xml文件SQL语句BadSqlGrammarException之FUNCTION错误系列

    想必各位在开发过程中一定使用过:统计的功能,用到了很多SQL的函数,于是就直接写在Mapper文件中了: 比如: member_num,MAX(ID) AS newestLoanID,MIN (ID) ...

  9. 查看所装jdk版本

    在D盘新建一个test.java文件 在文件里写如下代码: public class test { public static void main(String[] args) { String ar ...

  10. select2 多选 排序(版本3.4.6)

    使用select2多选,页面选择值的顺序与传到control的值的顺序不一致,为了方便,没有改变本来js文件,在页面上面通过change方法改变. 1.页面代码(添加修改使用同一个页面) <li ...