大数据技术之Hbase简介以及底层原理详解

简介

概述

  1. HBase是有Apache提供的基于Hadoop的分布式,可扩展的非关系型数据库
  2. HBase可以管理很大的数据的表 - billions of rows X millions of columns
  3. HBase是Doug Cutting根据Google的BigTable来实现,所以HBase和BigTable的原理一模一样,只是BigTable是用C语言实现的,HBase是Java语言实现的
  4. 本身是非关系型数据库,底层是利用键值对来存储
  5. 在HBase中也不支持多表关联
  6. HBase中数据类型只支持字符串和数字
  7. 适合存储稀疏数据 - 结构化数据和半结构化数据
  8. 在put的时候表名列族以及行键都一样,再一次put是更新的效果
  9. hbase作为一个数据库提供了完整的增删改查的功能,但是hbase是基于hdfs来进行存储的,hdfs上的数据是允许一次写入多次读取不允许修改允许追加的,hbase如何实现“改”的功能 - 当执行“改”操作的时候,HBase并不是修改原来的数据,而是在HDFS中存储的文件的尾端来追加数据,每一条数据都会自动添加时间戳,这个时间戳就是版本
  10. 通过时间戳,每一次默认返回最新的数据
  11. HBase中的表默认只保留一个版本的数据,也只返回一个版本的数据,如果保留版本,需要建表时需要手动指定

基本概念

  1. Rowkey - 行键

    • 在HBase中没有主键的概念,而是采用行键
    • 行键不属于任意列族
    • 建表的时候不需要指定行键,行键是在添加数据的时候手动指定
    • 默人字典排序
  2. Column Family - 列族/列族

    • 在HBase中,一个表中至少包含一个列族,可以多个列族
    • 理论上来说,列族的数量不限定,但一个表一般不超过三个。
    • 一个列族中可以包含0到多个列 - HBase,列是可以动态增删的,建表的时候不需要指定列。
  3. Cell - 单元

    • 在HBase中,通过行键+列族+列+版本可以确定唯一数据,这个结构成为cell单元
  4. namespace - 名称空间

    • 类似于mysql中的database
    • 默认自带两个名称空间default和hbase
    • 如果没有指定默认使用default

基本指令

命令解释
status查看HBase状态
version查看hbase的版本
whoami查看当前用户
create ‘person’ ,{NAME =>‘basic’},{NAME => ‘info’},{NAME => ‘other’}建表方式
List查看已经建立的表
put ‘person’ ,‘p1’ , ‘basic:name’ ,‘Reason’表示向person表中的basic列族name列添加行键p1的数据Reason
get ‘person’, ‘p1’, ‘basic:name’获取basic 列族name列的值
get ‘person’, ‘p1’, ‘basic’获取basic 列族所有值
get ‘person’ , ‘p1’获取行键p1所有的值
scan ‘person’ ,{COLUMNS => ‘basic:name’}获取basic所有name列的值
scan ‘person’ ,{COLUMNS => ‘basic’}获取basic列族所有列的值
scan ‘person’查看person表中的所有数据
delete ‘person’ ,‘p2’ ,‘other:phone’删除行键p2 other列族的phone字段
deleteall ‘person’ ,‘p2’删除行键p2的所有数据
create ‘student’ , {NAME => ‘basic’ ,VERSIONS =>3} ,{NAME => ‘info’ ,VERSIONS =>5}创建一个student表有basic 和info两个列族,basic保留三个版本,info保留5个版本
get ‘student’,‘s1’ ,{COLUMN =>‘basic:age’,VERSIONS => 4}查询student表列族为basic age字段的4个版本的值,但建表的时候指定三个版本,只能拿到最新的三个版本的值
disable ‘student’先禁用表
drop ‘student’再删除表
describe ‘person’ or desc ‘person’描述person表的信息
enable ‘person’启用person表
exits ‘person’判断person表是否存在
create ‘demo:person’ ,‘basic’ ,‘expand’在指定工作空间demo下创建person
list_namespace_tables ‘demo’查看指定名称空间的表
list_namespace查看所有的名称空间
create namespace ‘demo’创建名称空间demo
disable_all ‘demo:.*’禁用demo空间下所有的表
drop_all ‘demo:.*’删除demo中所有的表
drop_namespace ‘demo’删除工作空间demo

理论

HRegion

  1. 在HBase,会从行键方向上将一个表拆分成一个或者多个HRegion
  2. 每一个HRegion都会交会交由某一个HRegionServer来进行管理
  3. 由于行键是字典排序,所以HRegion之间的范围是不交叉的,也因此客户端在请求的时候会根据行键去访问不同的HRegionServer
  4. HRegion实际上是行键排序(默认是字典排序)后的按规则分割的连续的存储空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwoq1mNO-1626053727764)(/Users/yuxiangrui/blog/source/picture/截屏2020-04-27下午5.35.27.png)]

  1. 一张Hbase表,可能有多个HRegion,每个HRegion达到一定大小(默认是10GB)时,进行分裂。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6N3eTgEv-1626053727766)(/Users/yuxiangrui/blog/source/picture/截屏2020-04-27下午5.37.21.png)]

  2. HRegion包含了一个到多个HStore,HStore的数量由列族来决定

  3. HStore中包含一个1个memStore可能包含0个或多个storefile/hfile,hfile会落地到HDFS上进行存储

Zookeeper

  1. 当HBase第一次启动的时候,会在Zookeeper上注册一个持久节点
  2. 当HBase启动时候,HMaster会自动在zookeeper来注册一个/hbase/master节点
  3. Backup HMaster会自动在Zookeeper的/hbase/backup-masters下自动注册临时节点
  4. zookeeper在HBase中的作用注册中心的作用/统一注册

HMaster

  1. HMaster的状态分为:Active(活跃)和Backup(备份)
  2. 在任意一个安装了HBase去启动hmaster,sh hbase-daemon.sh start master
  3. 在HBase中不限制Hmaster 的个数,先开启的HMaster会自动成为active状态,后开启的为backup状态
  4. 当Active HMaster收到请求之后需要将这个请求和Backup HMaster之间进行备份,也因此在实际开发过程中Hamster的个数一般不超过三个1active Hmaster +2 backup hmaster
  5. Active HMaster会定时给Zookeeper发送心跳,同时监控/hbase/backup-masters下的子节点个数变化,如果发现/hbase/backup-masters下的字节点个数增加说明新增了Backup Hmaster;反之说明有节点产生丢失
  6. backup hmaster会定时给zookeeper发送心跳,同时监控/hbase/master节点是否存在,如果不存在意味着Active HMaster丢失
  7. HMaster的作用
    • 管理HRegionServer,主要是HRegion在HRegionServer之间的负载和转移
    • 管理HBase中的表结构(DDL操作),但是HMaster不负责表数据(DML操作)的管理

集群结构角度的读写流程

  1. 在HBase0.96之前
  2. 从HBase0.96开始
    • 去掉了-ROOT- 文件
    • 客户端从zookeeper中获取.meta.文件的位置之后会自动进行缓存,从第二次操作开始,就不需要再去访问zookeeper
    • 客户端从.meta.文件中读取数据之后也会自动进行缓存,但是如果发生了HRegion的分裂转移或者客户端宕机,那么缓存就会失效就需要重新建立缓存

HBase命令组

  1. DDL(Data Definition Language)数据库模式定义语言, 是用于描述数据库中要存储的现实世界实体的语言。
  2. DML(Data Manipulation Language)数据操纵语言,用户通过它可以实现对数据库的基本操作。

HRegionServer

  1. HRegionServer是HBase中的从节点,作用是用于管理HRegion,HRegion中的数据最终会以HFile形式存储到datanode
  2. 官方文档中,一个HRegionServer大概能管理1000个HRegion
  3. 一个HRegionServer由1个WAL(HLog)、1个BlockCache和0到多个HRegion来构成

WAL

  1. WAL - write ahead log 也称 Hlog
    • HRegionServer在收到写操作之后,会先将这个写操作记录到WAL中,然后再将数据更新到对应的memStore中,这样的设计是为了防止数据的丢失
    • WAL是维系在磁盘中,当达到指定条件的时候,WAL就会产生滚动,产生一个新的WAL,原来的WAl会变成OLD_WAL,OLD_WAL会在某一时刻被清除,这样做的目的是为了节省磁盘空间
    • 在HBase0.94版本之前,WAL是串行写;从HBase0.94版本开始,WAL引入了管道机制,所以允许进行并行写
    • 在实际开发过程中,如果能够容忍一定的数据库的数据产生丢失,可以关闭WAL提高写入效率

BlockCache - (数据块)缓存

  • BlockCache是一个读缓存,即会讲读取出来的数据进行缓存
  • BlockCache在进行数据缓存的时候,采取了“局部性”原理 —— “局部性”原理:实际就是一个猜测的过程,根据一定条件猜测来提高命中率
    • 时间局部性:在HBase中,如果一条数据被读取过,那么HBase就会把这条数据放入缓存
    • 空间局部性:在HBase中,如果一条数据被读取过,那么HBase会把与这条数据相邻的数据发入缓存中
  • BlockCache会将数据维系在内存中,BlockCache大小是128M
  • BlockCache在填满之后,采取LRU策略(Least recently used)抛弃最长时间不用的数据

HRegion

  • HRegion由一个到HStore来构成的 ,HStore的数量由列族的数量来决定
  • 每一个HStore中包含一个memStore以及0到多个HFile
    • memStore是一个写缓存,维系在内存中,大小是128M
    • memStore在达到指定条件之后,会产生冲刷,冲刷出一个HFile,HFile最终会落地到HDFS上
    • memStore冲刷条件:
      a) 当memStore满了之后,会冲刷产生一个HFile
      b)当我的WAL达到1G大小的时候,会冲刷产生一个HFile
      c) 当所有的memStore所占用的内存之和占到总内存的35%的时候,就会自动冲刷几个比较大的memstore
    • 第三个条件在实际开发过程中产生的频率最高,这会使HDFS产生大量的小文件

Compaction机制

  1. HBase中提供了Compaction机制,允许将多个HFile合并成一个HFile
  2. 分类:
    • minor compact :初次合并,在合并的时候,会讲相邻的几个小的HFile合并成一个较大的HFile不合并,合并完成之后依然存在多个HFile
    • major compact :主合并,在合并的时候。HFile无论多大,都会参与合并,最终会合并成一个HFile
  3. 在HBase中,如果不指定的情况下,默认使用minor compact
  4. 相对而言,minor compact 的效率更高一些,major compact虽然合并力度更大,但是在实际开发中,每次进行major compact都需要花费5-6个小时,在合并过程中,集群的大量资源(I/O、cpu等)倾斜到合并上,所以此时集群对外服务的效率会大大降低,所以major compact一般放在周末的凌晨进行
  5. 在合并的过程中,舍弃掉被标记为删除数据或者过时的数据,所以删除是在合并的过程中发生的

读写流程

写流程

  1. 当HRegionServer在收到写请求之后,会将写请求记录到到WAl中,会将数据更新到memStore中
  2. 数据在memStore中会进行排序:行键字典排序—>列族字典排序->列字典排序->时间戳倒序
  3. 当memStore达到冲刷条件的时候,会冲刷产生一个新的HFile,这个HFile是有序的 - 所有的HFile之间是局部有序的
  4. 正因为HFile是有序的,所以每一个HFile都把持了各自的起始行键和结束行键
  5. HFile最终会落地到HDFS中以block形式存储
    HFile的v1格式
    • DataBlock:存储数据,可以一个可以多个

      • 包含一个magic和多个key value
        1. magic: 魔数 本质上一个随机数,用于校验的

        2. KeyValue:DataBlock中存储的数据都是以键值对

      • 最小存储单位datablock
    • MetaBlock:存储元数据,一般只出现在.meta.文件中,其他的HFile中的一般没有这一块

    • FileInfo: 文件信息,对当前HFile的描述,例如文件大小信息

    • DataIndex:DataBlock的索引值,记录每一个DataBlock在文件中的起始字节和结束字节位置

    • MetaIndex:MetaBlock的索引值,记录每一个MetaBlock在文件中的起始字节和结束字节位置

    • Trailer:在文件末尾,固定占4个字节大小,其中前2个字节记录DataIndex在文件的起始字节位置,后2个字节记录MetaIndex在文件的起始字节位置

读流程

  1. 当HRegionServer收到请求之后,会首先从blockcahe中读取数据,如果没有读到,会从memstore中读
  2. 如果以上都没有读到,就会从HFile中读,会根据行键范围删选掉不符合范围的Hfile,再利用布隆过滤器筛选出一定没有的,缩小范围。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值