hbase的服务体系遵从的是主从结构,由HRegion(服务器)-HRegionServer(服务器集群)-HMaster(主服务器)构成,
从图中能看出多个HRegion 组成一个HRegionServer,HMaster管理所有的HRegion. 所有的服务器都是通过zookeeper来进行管理和协调工作的。
HMaster并不存储hbase中的数据,hbase逻辑上的表可能会被划分成多个HRegion,存到HRegion的集群中,hbase存储的是数据到HRegion集群中的映射
 
HRegion
当一张表的数据超过设置的其设置的值的时候,hbase会自动将表划分成不同的区域,每一个区域包含所有行的一个子集,对于用户来说,一张表就是一个数据集,我们通过主键来区分数据。从物理上来说,一张表被分成了一个个HRegion块,我们通过表名+开始/结束 主键区分,一个HRegion会保存某一段一个表中连续数据,从开始主键到结束主键一张完整的表格式保存在多个HRegion上面的。
 
HRegionServer
所有的数据一般都是存在hdfs上的,用户通过HRegion来获取这些数据,一般一台机器上只运行一台HRegion服务器,而一个区段HRegion也只被一个HRegion服务器维护(一个HRegion服务器维护一个区段的HRegion,一台服务器上只有一个区段)
HRegionServer分为两大部分(HLOG和HRegion):
    HLOG部分就是存储hbase的日志数据,采用先写日志的方式
    HRegion里面有很多个HRegion,HRegion是存放真实数据的,HRegion里面又有很多个Store,每个Store存储的实际上是一个列族下的数据,每一个Store都有一块MemStore, MemStore是驻留在内存中的,数据进来后会先存在MemStore中,当阈值到达之后数据会再更新到StoreFile中,每个Store里面有多个StoreFile,它是最小的存储单位
    Hbase中不涉及对数据的删除更新操作,他所有的更新操作都是以追加的方式进行。数据的删除和更新操作都在数据合并的时候进行,当超过Store中StoreFile的数量时候会进行数据合并,会触发数据合并操作,会把多个StoreFile合并成一个
    当用户需要更新数据的时候,hbase会把数据提交对应的HRegionServer上进行修改,数据会首先提交到log日志中,在写入log之后,才会commint()调用才会返回给客户端,如果某一台HRegionServer出现故障的时候,那么它所维护的HRegion会被分配到新的HRegionServer中,log日志会根据HRegion进行划分,当新的HRegionServer在加载HRegion时候,根据log日志对数据进行数据恢复
    当一个HRegion变的巨大超过其设置的阀值后,HRegionServer会调用HRegion的closeAndSpilt(),将这个HRegion拆分成两个,并报告主服务器使用哪个HRegionServer存放新的HRegion。这个过程会很快,因为原来的两个HReegion只是保留了StoreFile文件的引用,拆分的时候HRegion会处于服务停止的状态,当新的HRegion拆分完并把引用删除后,旧的HRegion才会删除。另外,两个HRegion可以通过调用HRegion.closeAndMeger()将两个HRegion合并成一个新的HRegion(有的Hbase版本在执行此操作的时候需要两台服务器都停止服务)
 
HMaster
每台HRegionServer都会跟HMaster进行通信,HMaster会告诉HRegionServer要维护哪些HRegion
当一台新的HRegionServer加入到HMaster服务器时,HMaster会先告诉他等待分配数,当有HRegion死机的时候,HMaster会把它分给其他的HRegionServer
如果一个Hbase可以启动多个HMaster服务,那么可是使用zookeper来保证只有一个HMaster运行
HMaster主要职责:
1:负责用户的增删改查操作
2:管理HRegionServer的负载均衡,分配HRegion
3:在HRegion分裂后,负责分配新的HRegion
4:在HRegion失效后,对失效的HRegion进行迁移
 
 
ROOT表和META表
ROOT表(根数据表):存储的是所有HRegion的元数据信息,并且这个表的数据不能分割,只存在一个HRegion。
META表(元数据表):存的是HRegion和HRegionServer的映射关系
 
    区分HRegion一般使用 表名+主键范围,HRegion里面存储的是连续的数据,所以一般使用主键就可以确定HRegion,但是HRegion有合并,分割的操作,有可能在进行这个操作的时候出现死机,这时就有可能出现多份相同的主键和表名的数据。这个时候使用 主键+表名就不能确定哪个HRegion了。
    HRegion的区分方式最好使用 表名+主键+唯一id(regionID),这些数据就是元数据,元数据本身是存在HRegion里,META表存的是HRegion和HRegionServer的映射关系。元数据也会不停的增长,为了定位这些元数据表的位置,我们把元数据表的位置放在ROOT表中,这个表存放所有元数据表的位置,这个表是不被分割的。
    Hbase在启动的时候主服务器会先扫描root表,(因为这个表只有一个 HRegion,所以HRegion的名字是写死的)将表分配 给对应的HRegion。
    当root表被分配好以后,就会读取元数据表的名字和元数据表的位置,然后把元数据表(metaTable)分配给不同的HRegionServer,然后再读取元数据表,找到HRegion的区域信息,分配给不同的HRegionServer
 
    元数据表和跟数据表的每一行都包含一个列族

所以,当客户端拿到根数据表时,就不需要再访问主服务器了。因为,root表包含所有meta表的位置,meta表包含所有用户的空间区域列表和HRegionServer的位置,客户端可以缓存已知所有的root表和meta表。主服务器就负责超时的HRegion,就只在hbase启动的时候扫描root表和meta表,以及返回root表的HRegionServer位置
 
zookeeper
zookeeper里存储的是root表和meta表 的位置,每台机器都会在zookeeper中注册一个实例,zookeeper就会监控这些机器的状态,当某一台机器出现故障时,zookeeper会第一个感知,然后告诉hMaster然后进行相关处理,zookeepe还负责hMaster的恢复工作,并保证在同一时刻,只有一个hMaster提供服务。
 
 
 
 
 
 
 

hbase 的体系结构的更多相关文章

  1. Hadoop中Hbase的体系结构

    HRegion 当一张表中的数据特别多的时候,HBase把表拆成多个块,每个块就是一个HRegion,每个region中包含这个表里的所有行 HRegionServer 数据库的数据存在HDFS文件系 ...

  2. HBase的体系结构

  3. Hbase Java API详解

    HBase是Hadoop的数据库,能够对大数据提供随机.实时读写访问.他是开源的,分布式的,多版本的,面向列的,存储模型. 在讲解的时候我首先给大家讲解一下HBase的整体结构,如下图: HBase ...

  4. HBase基础和伪分布式安装配置

    一.HBase(NoSQL)的数据模型 1.1 表(table),是存储管理数据的. 1.2 行键(row key),类似于MySQL中的主键,行键是HBase表天然自带的,创建表时不需要指定 1.3 ...

  5. Hadoop 面试题之Hbase

    Hadoop 面试题之九 16.Hbase 的rowkey 怎么创建比较好?列族怎么创建比较好? 答: 19.Hbase 内部是什么机制? 答: 73.hbase 写数据的原理是什么? 答: 75.h ...

  6. Hadoop之——HBase注意事项

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46447573 1.HBase(NoSQL)的数据模型 1.1 表(table) 存 ...

  7. 分布式存储系统-HBASE

    简介 HBase –Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBse技术可在廉价PC Server上搭建起大规模结构化存储集群.HBase利用Had ...

  8. HBase、MongoDB、cassandra比较

    前言 传统数据库遇到的问题,数据量很大的时候无法存储:没有很好的备份机制:数据达到一定数量开始缓慢,很大的话基本无法支撑:因此我们需要探究更加合适的数据库来支撑我们的业务. HBase 什么是HBas ...

  9. hbase总结~hbase配置和使用

    Base配置和使用文档......................................................................................... ...

随机推荐

  1. sql语句,order by

    ORDER BY子句必须出现在SELECT中的最后一个子句. 在排序的列中NULL值被认为是最大的. 在SQL语句中给表达式定义别名是一个好习惯. 多列排序时不管升序还是降序,每个列需要单独设置

  2. [原创] C# dynamic拼接Json串

    using Newtonsoft.Json; 之前拼接两个json串,是用的这样的代码 , json1.Length - ); json2 = json2.Insert(json2 - , tmp); ...

  3. linux 卸载编译安装的软件

    有些软件会有 make uninstall 之类的功能,但大多都没有,所以只有手动删除,或者在configure的时候加个preifx参数,比如 --preifx=/opt/squid,这样当你不用的 ...

  4. Linux下安装 MySQL

    Ubuntu环境 使用二进制安装包安装,相对简单绿色 1.到官网下载二进制压缩包http://dev.mysql.com/downloads/mysql/ 2.选择需要的版本 目前最新为5.7.之后选 ...

  5. npm 发布到远程资源库

    一.npm 发布到远程资源库 1.创建package.json Package.json 属性说明 name - 包名. version - 包的版本号. description - 包的描述. ho ...

  6. ActiveMQ入门实例

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...

  7. 补发:用Meal Prep+模块化饮食来减肥之实操

    自从上次读到仰望尾迹云 老师的模块化饮食的帖子,再了解了一些Meal Prep的内容,结合着做Meal Prep健康餐至今已经快一个半月了.整体感觉还可以,所以在这里讲一下自己的心得体会. 分为三个部 ...

  8. HDOJ 4770 Lights Against Dudely

    状压+暴力搜索 Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. JavaScript对象创建,继承

    创建对象 在JS中创建对象有很多方式,第一种: var obj = new Object(); 第二种方式: var obj1 = {};//对象直面量 第三种方式:工厂模式 function Per ...

  10. py

    import httplib,urllib import re import random def Login(userid,password): params=urllib.urlencode({' ...