HBase架构

BigTable

  • HDFS:分布式文件系统
  • MapReduce:分布式计算框架
  • Hive:数据仓库。用来计算分析数据
    在这里插入图片描述
    最下面两层是数据存储
    上面两层做数据分析

1、非关系型数据库

  • cassandra hbase mongodb
  • counchdb 文件存储数据库
  • Neo4j非关系型图数据库

2、HBase简介:

  • Hadoop Database,是一个高可靠、高性能、面向列(面向列的键值对格式。没有固定的列数,随着插入的数据来决定,有可能第一行两列,下一行三列)、可伸缩(可以动态的扩展机器,不需要暂停当前集群的服务,可以扩充或减少机器)、实时读写(支持海量数据的快速查询)的分布式数据库
  • 利用HadoopHDFS作为其文件存储系统,利用hadoop MapReduce来处理HBase中的海量数据,利用zookeeper做为其分布式协同服务
  • 主要用来存储非结构化和半结构化的松散数据

3、HBase数据模型:

  • KEY=Row Key+时间戳+列族(column family)+列名,来唯一的确定一个值。
  • 不存在删除更新操作,等到溢写和文件合并时将失效标记的数据删除
  • 一行里面可能包含n多个列,每个列一定是属于某个列族(column family)的(面向列存储)
  • ROW KEY
    • 决定一行数据(类似于mysql中的主键)
    • 按照字典顺序排序的
    • Row key只能存储64k的字节数据 (64*1024byte)(一般只存10-100byte)
  • Column Family列族
    • HBase表中的每个列都归属于某个列族,列族必须作为表模式定义的一部分预先给出。HBase表创建的时候不需要指定列,列是伴随着插入数据值的时候指定的。 但是定义表的时候必须给出列族,才能知道数据存放到哪个列族里面去。
    • 列名以列族作为前缀,每个列族都可以有多个列成员;如course:math,course:english,新的列族成员(列)可以随后按需、动态加入;
    • 权限控制、存储以及调优都是在列族层面进行的;(最小粒度就是列族,该列族下的所有列都具有相同的属性)
    • HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。

在这里插入图片描述

  • Timestamp时间戳
    • 在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
    • 时间戳的类型是64位整型
    • 时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间
    • 时间戳也可以由客户显示赋值(但一般不用),如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳
  • Cell单元格
    • 由行和列的坐标交叉决定
    • 单元格是由版本的(timestamp)
    • 单元格的内容是未解析的字节数组
      • 由{row key,列族+列名+版本} 唯一确定的单元
      • cell中的数据是没有类型的,全部是字节数组形式存储
  • HLog(WAL log (write ahead log预写日志))
    • 记录操作信息和值信息,为了防止数据丢失,恢复时使用
    • HLog文件就是一个普通的Hadoop Sequence File,Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括sequence number和timestamp,timestamp是写入时间,sequencenumber 的起始值为0,或者是最近一次存入文件系统中的sequence number。
    • HLog Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue

4、HBase架构

  • 角色(服务):namenode datanode resourcemanager nodemanager等等,它们各自承担一部分功能

  • HBase也有角色

    • client:访问zookeeper,hmaster也访问zookeeper,client不直接和HMaster交互。zookeeper类似于一个数据中心。client访问zk得到元数据信息,hm将元数据信息存到zk中。
    • zookeeper:高可用+分布式协作服务(存储一些元数据的元数据)
    • HMaster
      • 在HBase中是一个主从架构,并非主备架构,主备结构是做同一件事,主从架构类似于resourcemanager和nodemanager,分工合作
    • HRegionServer:HBase的从节点。
      • 承担具体的查询存储等工作
  • 启动集群,hm和hrs的服务被启动,启动完之后,hm和hrs做交互,他们之间有心跳机制。zk和hrs也要通讯,因为zk主要负责消息发布订阅,当hmaster启动完之后要告诉zk我是一个master,已经启动完毕。hrs也需要向zk做同样的汇报。

  • client提交一个请求,先访问zk,zk存储的是元数据,zk提供的元数据并不是特别多,只能存 1M。所以zk中的数据是元数据的元数据,即元数据存放在哪个位置等。

  • 当client拿到元数据信息后再访问hrs。hrs记录的是所有表的所有相关信息,查到对应的表,得到对应的startkey和endkey,(因为row key是按字典序排序,相邻的一组数据放在连续的空间内),再到对应的节点上拿取表的数据。

  • 1、访问zk,拿元数据所在节点的位置信息;2、访问元数据所在的那台hrs;3、去对应的hregionserver访问表里面的数据

  • 三步执行完之后,如果向表里面写数据,该表对应了某一个hregionserver或者某多个

    • 先找到对应的HRegion(和表同一个层次,一个表至少有一个HRegion):里面有hlog和store(对应列族)
    • 先写入到hlog中(数据丢失之后可以根据hlog恢复数据),先写入内存,然后由一个单独的线程检测该内存中是否有数据,如果有数据则写入hdfs中。(分两步,异步)(每60min打开一个新的日志文件,不可能只往一个日志文件中存)HLOG被当前Hregionserver中的所有hregion所共享。
    • 再找到对应的store(列族),找到store之后,写到内存中MemStore(默认64M),对hdfs而言是小文件(因为默认的块是128M),当内存中达到阈值后会发生溢写,溢写之后变成一个一个的小文件称为storefile,storefile是hfile的封装,当小文件数目过多时会发生合并(合并的方式有两种)。当数据存储到hdfs上时叫hfile,只不过在HBASE内叫storefile。
      • MemStore和StroeFile整体叫 LogStructMerge树,先写入内存(memstore),当内存满了再由另外一个线程往磁盘写(storefile)。
        • 当磁盘是顺序写时,速度会较随机写快很多
        • 当memstore满了,会被添加到溢写队列中然后开一个新的memstore
  • 1、访问zk,拿元数据所在节点的位置信息;2、访问元数据所在的那台hr;3、去对应的hregionserver访问表里面的数据

  • 三步执行完之后,如果读数据,找到对应的hregion,先去memstore找,如果没有再去blockcache找(blockcche被每一个regionserver所共享),如果没有再去找磁盘,找完之后会把结果缓存blockcache(也是一块内存)中。存在一个淘汰机制,当blockcache中满了,谁先进来的谁先走。

  • 各个角色承担的任务

    • client

      • 包含访问HBase的接口(命令行、API)并维护cache(客户端缓存)来加快对HBase的访问
    • Zookeeper

      • 保证任何时候,集群中只有一个活跃的master
      • 存储所有region(所有表)的寻址入口,(表存储在哪个regionserver中(元数据的元数据))
      • 实时监控region server的上线和下线信息。并实时通知master。
        • 当rs不正常要通知master,因为rs原本存储了很多表的元数据,当该rs挂掉之后,如果不将它原本存储的元数据放到健康的rs中,那么对应的真实数据就无法被访问到了。真实数据文件是存储在hdfs中的,并没有丢失,还应该继续被访问。同样的当有空闲的rs时也应该告诉master,建表时可以存到该rs中。
      • 存储hbase的schema和table元数据
    • Master

      • 为RegionServer分配region(表)(来决定哪张表存到哪个rs中)
      • 负责region server的负载均衡(不要出现某些特别忙,某些很闲的情况)
      • 发现失效的region server并重新分配其上的region(表)
      • 管理用户对table的增删改操作
    • Region Server

      • rs维护region(表),处理对这些region的io请求
      • rs负责切分在运行过程中变得过大的region,(等分,将另一半放在比较空闲的rs中。所以一个表对应n多个region,每一个region分布在不同的rs中,region有可能在同一台有可能不在同一台)
    • Region

    • HBase自动把表水平划分成多个region,每个region会保存一个表里面某段连续的数据

    • 每一个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阈值的时候,region就会等分成两个新的region(裂变)

    • 当table中的行不断增多,就会有越来越多的region。这样一个完整的表被保存在多个region server中。

    • Memstore与storefile

      • 一个region由多个store组成,一个store对应一个列族
      • store包括位于内存中的memstore和位于磁盘的storefile。写操作先写入memstore,当memestore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次形成单独的一个storefile
      • 当storefile文件的数量增长到一定阈值后,(达到3个之后会合并)系统会进行合并(minor(3-10个文件)、major (当前region下的所有文件)compaction),在合并过程中会进行版本合并和删除工作(将失效标记的数据删除),形成更大的storefile
      • 当一个region所有storefile的大小和数量超过一定阈值后,会把当前region分割为两个,并由hmaster分配到相应的regionserver,实现负载均衡
      • 客户端检索数据,先在memstore找,找不到再找blockcache,找不到再找storefile。
    • HRegion是HBase中分布式存储和负载均衡的最小单元,最小单元就表示不同的HRegion可以分布在不同的HRegionserver上。

    • HRegion有一个或多个store组成,每个store保存一个column family(列族)

    • 每个store又由一个memstore和0至多个storefile组成。 storefile以hfile格式保存在hdfs上
      在这里插入图片描述
      在这里插入图片描述
      每一个regionserver包含多个region,每一个region包含多个storm,每一个storm由一个memstore和0至多个storefile组成。
      row key按字典序排序,在memstore中会有一次排序,溢写出的小文件内部是有序的,文件与文件之间是无序的,所以文件合并时会对应一次排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值