浅谈大数据之HBase

HBase是一个开源的非关系型分布式数据库,参考了谷歌的BigTable建模,实现编程语言是java。
HBase运行于HDFS文件系统上,同时有少量的数据存在自身的内存中,可以容错的存储海量稀疏数据,不能保证key就一定是有数据的
HBase的特性包含了:高可靠,高并发读写,面向列,可伸缩,易构建。
HBase的优点:存储海量数据,快速随机访问,可以进行大量的读写操作(先写入内存再落地磁盘,所以支持改写

数据模型

6149692d-27fd-4fb7-8e77-2d7809c292ef-2500378.jpg

RowKey

  • Byte array,表中每条记录的主键,方便快速查找

Column Family

  • 列族,拥有一个名称(String),包含一个或者多个相关列,子列称为(Column qualifier)

Column Qualifier

  • 属于某一个Column Family,familyName:columnName,每条记录可动态添加
  • 如果一个列的数据需要更改,不是在原有的数据源上更改,而是新增一条数据,原有的数据源以一个版本的形式进行记录

Version Number

  • 类型为Long,默认值是系统时间戳,可自定义

Value

  • Byte array

1a7739c3-2319-4e81-bbda-d53a351db5b0-2500378.jpg

物理模型

  • 物理模型是支撑数据模型的实现,数据模型处理细节
  • HBase相当于MR里的partition,相同的key肯定会出现在一个region上
  • region是hbase集群分布数据的最小单位,类似HDFS中的block
  • 一个region只能属于一个regionServer,一个regionServer可以拥有多个region

名词解析

Region(逻辑概念)

  • 数目
    • 太多:增加Zookeeper负担,造成读写性能下降
    • 太少:降低读写并发的性能,导致压力不够分散
  • 切分
    • region按大小分割,初始只有一个region,数据增大到阀值时HRegion会等分为两个新的HRegion。默认10个G,超出会进行切分
    • 对于region过大的要做切分,切成更小粒度的region,分散到其他regionServer上去来缓解压力,负载均衡,region越大,访问到该机器的概率越大
    • 不允许系统自动切分,空闲时刻再做手动气氛,切分过程中,region是不能访问的,只能等
    • 一个HRegion是不会拆分到多个server上的

HRegion(物理概念)

  • HRegion指一个区域或者分区

RegionServer(逻辑概念)

  • 一个节点(机器)里有多个region,节点称为RegionServer
  • RegionServer里面存储很多Region(不一定来自同一个table)

HRegionServer(物理概念)

  • HRegionServer当做一个机器上的进程,主要负责响应用户的IO请求,与HDFS交互
  • HRegionServer存储着很多HRegion
  • HRegion是HBase分布式存储和负载均衡的最小单元,但不是存储的最小单元
  • HRegion里面有很多HStore,HStore是HBase核心的存储单元

HStore

  • MemStore:是一块内存,主要负责写入数据,当达到128M,将内存flush成为一个StoreFile
  • StoreFile(HFile–>HDFS,默认128M):对应着table的Column Family

HLog

日志机制,避免数据的丢失,一个regionServer上的所有region共享一个HLog
d2964b54-9aa2-483a-b56d-c77dc467f743-2500378.jpg

  • WAL(write-ahead-log)预写日志
    • 客户端往RegionServer提交数据,先写WAL日志和memstore,都写成功告知数据提交成功,反之告知客户端失败
    • 一个RegionServer上的所有的region都共享一个HLog,一次数据的提交是先写WAL,成功后写入memstore,当memstore达到一定阈值,就会写成一个个storeFile

系统架构

Client

访问HBase的接口,并维护Cache加速RegionServer的访问

HMaster(主)

  • 负载均衡
    管理和分配HRegion(记录region分配到哪个regionServer,以及regionServer挂掉之后的region迁移)
  • 管理HRegion
    DDL:增删改—>table,cf,namespace
  • 管理table元数据
    类似于namenode,管理一些元数据(table–>table结构)
  • ACL权限控制

HRegionServer(从)

  • 管理和存放本地的HRegion
  • 读写HDFS,提供IO操作
  • 维护table数据
  • 本地化
    HRegion的数据尽量和数据所属的DataNode在一块,但是这个本地化不能够总是满足和实现(HRegion是不断移动的,因为数据不断插入,HRegion是不断分裂的,本地化不能保证)

Zookeeper

  • 提供了心跳机制,在master和zk之间、和regionServer之间
  • 保证集群中只有一个master
  • 存储所有region的入口(root)地址
  • 实时监控regionServer的上下线信息,并通知master
    Zookeeper协调集群所有节点的共享信息,在HMaser和HRegionServer连接到Zookeeper后创建Ephemeral节点(临时节点,监控心跳),并使用HeartBeat机制维持这个节点的存活状态,如果某个Ephemeral节点失效,则HMaser会收到通知,并做相应的处理

容错

master

Zookeeper重新选择一个新的master

  • 无master过程中,数据读取仍照常进行
  • 无master过程中,region切分/负载均衡等无法进行

regionServer

定时向Zookeeper汇报心跳,如果一段时间内未出现心跳,master将该regionServer上的region重新分配到其他regionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的regionServer

Zookeeper

Zookeeper是一个可靠的服务,一般配置3或5个Zookeeper实例

写入流程

  • 当客户端发起一个put请求时,首先它从hbase:meta表汇总查出该put数据最终需要去的HRegionServer,然后客户端将put请求发送给相应的HRegionServer,在HRegionServer中它首先会将put操作写入WAL日志(flush到磁盘中)
  • 写完WAL日志文件后,HRegionServer根据put中的tableName和rowKey找到对应的HRegion,并根据Column Family找到对应的HStore,并将put写入到该HStore的memStore中,此时写成功,并返回通知客户端
    images
  • memStore是一个In Memory Sorted Buffer,在每个HStore中都有一个MemStore,即它是一个HRegion的一个Column Family对应一个实例。它的排列顺序以RowKey、Column Family、Column的顺序以及Timestamp的倒序
    images

读取流程

  • 从Zookeeper(/hbase/meta-region-server)中获取hbase:meta的位置(HRegionServer的位置),缓存该位置

    hbase:meta这个表不做分裂,只存储用户表的元数据

  • 从HRegionServer中查询用户Table对应请求的RowKey所在的HRegionServer,缓存该位置信息
  • 从查询到的HRegionServer中读取Row
  • 整行数据读取是从多个HFile中获取的,memStore中的是最新的数据,还没存储下来的数据,所以数据需要定期合并
    images
  • HBase中扫描顺序依次是BlockCache,memStore,HFile
    • BlockCache:LRU的算法,频繁操作,频繁读取的数据会提起缓存,长时间不用的数据会淘汰掉
    • memStore:读缓存
    • HFile:读文件
      images
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值