HBase技术原理(nosql)

2022/7/29 2:53:16

本文主要是介绍HBase技术原理(nosql),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  NoSQL数据库 关系型数据库与NoSQL数据库的主要区别 CAP理论和BASE原则 HBase概述 HBase与关系数据库的对比 HBase应用场景 HBase数据模型 HBase表结构 行存储和列存储的比较 HBase架构 HBase架构介绍 HFile文件格式 Region定位(1) Region定位(2) 用户读写数据过程 Flush机制 Compaction机制(1) Compaction机制(2) Region拆分 其他流程 HBase性能优化-行键 HBase性能优化-预分区 HBase性能优化-表热点现象 HBase常用操作 DDL操作(1) DDL操作(2) 权限管理 NoSQL数据库
  • NoSQL(not only sql),即“不仅仅是sql”。
  • NoSQL数据库分类:
  1. 键值存储数据库
  2. 列存储数据库
  3. 文档数据库
  4. 图数据库
  关系型数据库与NoSQL数据库的主要区别

 

 

  CAP理论和BASE原则
  • CAP理论
  1. 一致性
  2. 可用性
  3. 分区容错性
  • BASE原则
  1. 基本可用
  2. 软状态
  3. 最终一致性
  HBase概述
  • HBase是一个高可靠性,高性能,面向列,可伸缩的分布式存储系统。
  1. 适合于存储大表数据(表的规模可以达到数十亿行以及数百行列),并且对大表数据的读,写
  2. 访问可以达到实时级别。
  3. 利用Hadoop HDFS作为其文件存储系统,提供实时读写的分布式数据库系统。
  4. 利用Zookeeper作为协同服务。
  HBase与关系数据库的对比
  • HBase与传统的关系数据库的区别主要体现在一下几个方面:、
  1. 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引,即行键。通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,后者通过行键扫描,从而使得整个系统不会慢下来。
  2. 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留。
  3. 可伸缩性:关系数据库很难实现横向扩展,纵向国战的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。
  HBase应用场景

 

 

  HBase数据模型
  • 特点
  1. 一个表可以有上亿行,上百行列
  2. 面向列(族)的存储和权限控制,列(族)兜里检索
  3. 表结构稀疏,行和列的交叉点被称为cell,表的行键也是一段字节数组
  4. 所有的表都必须有主键,表是按key排序的

 

 

  HBase表结构
  • 表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族。
  • 行:每个HBase表都由若干个行组成,每个行由行键来标识。
  • 列族:一个HBase表被分组成许多“列族”的集合,他是基本的访问控制单元。
  • 列限定符:列族里的数据通过列限定符(或列)来定位。
  • 单元格:在HBase表中,通过行,列族和列限定符确定一个“单元格”(cell),单元格中村粗的数据没有数据类型,总被视为字节数组byte[]
  • 时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引。

 

 

  行存储和列存储的比较
  • 行存储,数据按行存储在底层文件系统中。通常,每一个会被分配固定的空间。
  1. 优点:有利于增加/修改整行记录等操作;有利于整行数据的读取操作。
  2. 单列查询时,会读取一些不必要的数据。
  • 列存储,数据以列为单位,存储在底层文件系统中。‘
  1. 优点:有利于面向单列数据的读取/统计等操作。
  2. 缺点:整行读取时,可能需要多次I/O操作。

 

 

HBase架构

 

 

  HBase架构介绍
  • 客户端
  1. 包含访问HBase的接口,并维护Cache来加快对HBase的访问
  • HMaster
  1. 主要负责表和region的管理工作
  • HRegionServer
  1. 主要负责相应用户的I/O请求,向HDFS中读/写数据
  2. 管理了一系列HRegin对象,每个HRegin由多个store组成
  • ZooKeeper
  HFile文件格式
  • HFile文件格式分为如下6部分:
  1. Data Block:保存table中的数据
  2. Meta Block:保存用户自定义的key-value对
  3. file Info:HFile的元信息
  4. Data Block Index:Data Block的索引
  5. Trailer:这一段是定长的,保存了每一段的偏移量。
  Region定位(1)

 

 

Region定位(2)
  • 为了加快访问速度,.meta.表会被保存在内存中。
  • 假设.META.表的每行(一个映射条目)在内存中大约占用1kb,并且每个Region限制为128MB.
  • 两成结构可以保存的Region数目是128MB/1kb=2的17次方个Region。
  用户读写数据过程
  • 用户写入数据时,被分配到相应Region服务器去执行。
  • 用户数据首先被写入到MemStore和Hlog中。
  • 只有当操作写入Hlog之后,commit()调用才会将其返回给客户端。
  • 党与胡读取数据时,Region服务器会首先访问MemStore缓存,如果找不到,再去磁盘上面的storefile中寻找。
  Flush机制
  • 触发MemSTORE的FLUSH操作场景
  1. MemStore到达HBase.hregion.memstore.flush.size(默认128MB),所有Memstore触发FLush。
  2. 当MemStore的内存用量比例到达HBase.regionserver.global.me mstore.upp -erlimit的指定大小时,触发Flush。Flush的顺序基于Memstore内存用量大小的倒序,直到MemStore内存用量小于HBase.regionserver.global.memstore.lowerlimiit.
  3. 当wal的日志数量超过HBase.regionserver.max.logs,MemStore就会FLush到磁盘,降低WAL中的日志数量。最“老”的MemStore会第一个被Flush,直到日志数量小于HBase.regionserver.max.logs。
  4. HBase定期Flush MemStore:默认周期为1小时,确保MemStore不会长时间没有持久化。
  5. 手动执行Flush。
  Compaction机制(1)
  • Minor Compaction是指选取一些小的,相邻的storefile,讲题目合并成一个更大的storefile。
  • Major Compaction是指所有的StoreFile。
Compaction机制(2)
  • 除法Compaction的因素
  1. MemStore Flush
  2. 后台线程周期性检查
  3. 手动触发
  Region拆分
  • 当Region的大小超过了预设的阈值时,HBase会拆分Region。
  • Region拆分策略
  1. constantsizeregionsplitpolicy
  2. increasingtoupperboundregionsplitpolicy
  3. steppingsplitpolicy
  4. delimitedkeyprefixregionsplitpolicy
  5. disabledregionsplitpolicy
  其他流程
  • Region合并
  1. Region拆分更多处于提高性能的目的,但Region合并更多出于维护系统的目的。
  • HLog工作原理
  1. 一种预写日志。
  2. 用户更新的数据必须先写入日志后,才能写入MemStore缓存。
  3. 知道MemStore缓存内容对应的日志已经写入磁盘,该缓存内容才能被Flush到磁盘。
  HBase性能优化-行键
  • 行键是按照字典序存储。因此,设计行键时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
  • 举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为行键的一部分,由于是字典序排序,所以可以使用long.MAX_VALUE - timestamp作为行键,这样能保证新写入的数据在读取时可以被快速命中。
  HBase性能优化-预分区
  • 手动指定预分区
  1. 通过在创建表语句中指定行键的前缀界限来指定预分区
  2. create 'person','info1','info2',SPLITS=>['1000','2000','3000','4000']
  • 使用SPLITALGO的UniformSplit方式
  1. HexStringSplit适用于采用十六进制的字符串作为前缀的行键
  2. DecimalStringSplit适用于采用十进制数字字符串作为前缀的行键
  3. UniformSplit则适用于前缀完全随机的行键。
  HBase性能优化-表热点现象
  • 解决“热点”现象有如下几种方法:
  1. 预分区:让表中的数据可以均衡的分散在集群中
  2. 加盐:RowKey的前面增加随机数
  3. 反转:反转固定长度或者数字格式的行键,可以使得行键中经常改变的部分(最没有意义的部分)放在前面。
  HBase常用操作
  • 查看集群的状态
  1. hbase>status
  2. hbase>status 'simple'
  3. hbase>status 'summary'
  4. hbase>status 'detailed'
  • 帮助命令
  1. hbase>help
  DDL操作(1)
  • 列出所有表
  1. hbase>list
  • 获取表的详细信息
  1. hbase>describe 'tablename'
  • 创建一张表
  1. create<table>,{NAME=><family> [VERSIONS=><version>...]}
  • 修改一张表
  1. hbase>alter 't1',NAME=> 'f1',VERSIONS=>5
  DDL操作(2)
  • 插入更新数据
  1. put <table>,<rowkey>,<family:column>,<value>,<timestamp>
  • 查询数据
  1. get<table>,<rowkey>,[<family:column>,...]
  • 扫描表
  1. scan <table>,{COLUMNS=>[<family:column>,...],LIMIT=>num}
  • 删除某个值
  1. delete<table>,<rowkey>,<family:column>,<timestamp>
  • 清空表
  1. truncate<table>(慎用)
  权限管理
  • 语法:
  1. grant <user> <permissions> <table> <column family> <column qualifier>
  2. 权限用R,W,X,C,A这5个字母表示,其对应关系为READ('R'),WRITE('w'),EXEC('x'),CREATE('C'),ADMIN('A')
  • 查看权限
  1. user_permission<table>
  • 收回权限
  1. revoke <user> <table> <column family> <column qualifier>




这篇关于HBase技术原理(nosql)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程