大数据笔记之Habse

什么是Hbase

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

特点

海量存储
适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,
能在几十到百毫秒内返回数据。
列式存储
这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。
极易扩展
一是基于上层处理能力(RegionServer)的扩展
二是基于存储的扩展(HDFS)
高并发
由于目前大部分使用 Hbase 的架构,都是采用的廉价 PC,因此单个 IO 的延迟其实并不小,一般在几十到上百 ms 之间。这里说的高并发,主要是在并发的情况下,Hbase 的单个IO 延迟下降并不多。能获得高并发、低延迟的服务。
稀疏
稀疏主要是针对 Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

架构

在这里插入图片描述
1 )Client
Client 包含了访问 Hbase 的接口,另外 Client 还维护了对应的 cache 来加速Hbase 的访问
2 )Zookeeper
HBase 通过 Zookeeper 来做 master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。

3 )Hmaster

  1. 为 RegionServer 分配 Region
  2. 维护整个集群的负载均衡
  3. 维护集群的元数据信息
  4. 发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上
  5. 当 RegionSever 失效的时候,协调对应 Hlog 的拆分

4 )HregionServer

  1. 管理 master 为其分配的 Region
  2. 处理来自客户端的读写请求
  3. 负责和底层 HDFS 的交互,存储数据到 HDFS
  4. 负责 Region 变大以后的拆分
  5. 负责 Storefile 的合并工作

5 )HDFS

  1. 提供元数据和表数据的底层分布式存储服务
  2. 数据多副本,保证的高可靠和高可用性

Hbase角色

HMaster

  1. 监控 RegionServer
  2. 处理 RegionServer 故障转移
  3. 处理元数据的变更
  4. 处理 region 的分配或转移
  5. 在空闲时间进行数据的负载均衡
  6. 通过 Zookeeper 发布自己的位置给客户端

RegionServer

  1. 负责存储 HBase 的实际数据
  2. 处理分配给它的 Region
  3. 刷新缓存到 HDFS
  4. 维护 Hlog
  5. 执行压缩
  6. 负责处理 Region 分片

Region
Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个 RegionServer 中可以有多个不同的 region。

Store
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。

Write-Ahead logs
数据会先写在一个叫做 Write-Ahead logfile 的文件
中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

MemStore
内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在
WAL 中之后,RegsionServer 会在内存中存储键值对。

HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile的形式存储在 HDFS 的。

HBase 数据结构

RowKey

行键: 用来检索记录的主键。访问Hbase table 中的行,有三种方式:

  1. 通过单个RowKey访问
  2. 通过RowKey的range(正则)
  3. 全表扫描

RowKey可以是任意字符(最大长度为64KB,实际应用长度一般为 10-100 byte),RowKey 保存为字节数组。数据按照RowKey的字典序排序存储。 在设计RowKey时,要充分利用排序存储的特性,将经常一起读取的行存放到一起。

Column Family

列簇: Hbase表中的每个列,都归属于某个列簇。列簇是表的schema的一部分(列不是),必须在使用表前定义。列名都以列簇作为前缀。

Cell

由{rowkey, column Family:column, version} 唯一确定的单元。cell 中的数据没有类型,全部是字节码形式存贮。

Time Stamp

时间戳: 版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以由 HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
数据版本回收方式:一是保存数据的最后 n 个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

命名空间

在这里插入图片描述
Table: 所有表都是命名空间的成员,如果未指定,则在default 默认的命名空间中
**RegionServer group:**一个命名空间包含了默认的RegionServer Group
**Permission:**权限,定义访问控制列表ACL(Access Control List)
**Quota:**限额,可以强制一个命名空间可包含的region的数量

Hbase原理

写数据流程

在这里插入图片描述

  1. client访问zk找到meta的位置,到对应的RS获取该表或直接从缓存读取该表
  2. client找到对应region
  3. client提交写数据请求
  4. region检查数据与schema是否一致
  5. 若client没有指定版本,以当前系统时间戳为数据的版本
  6. 先更新写入wal hlog 、再写入memstore
  7. 判断memstore是否刷写磁盘(memstore满后触发flush机制,写入storefile)
  8. storefile小文件达到一定数量阈值触发compar机制,合并多个storefile形成更大的storefile
  9. 当合并后一个大的storefile达到阈值触发split,等分region

写原子性:写操作必须保证Hlog和memstore都写入完成才会返回成功,而且使用读写行锁保证一次写入期间其他读写操作请求会阻塞等待

读数据

在这里插入图片描述

  1. client从zk获取meta表的位置,到对应的RS获取该表或者直接缓存中读取该表
  2. client从meta比奥中获取行键所在region位置
  3. 先从memstore读取,再从blockcache读取,最后才到hfile中查找,查找hfile前先用布隆过滤器筛选出可能存在该行键的hfile,从hfile读取到数据会复制一份到blockcache中

数据flush过程

  1. 当MemStore数据达到阈值(默认128M),将数据刷到硬盘,将内存中的数据删除,同时是、删除HLog中的历史数据
  2. 并将数据存储到HDFS中
  3. 在HLog中做标记

数据合并过程

  1. 当数据块达到阈值(默认4块),Hmaster触发合并操作,Region将数据块加载到本地进行合并
  2. 当合并的数据超过 256 M,进行拆分,将拆分后的 Region 分配给不同的HregionServer管理
  3. 当HregionServer宕机后,将Hregion分配给不同的HregionServer加载,修改.META.
  4. 注意:HLog会同步到HDFS

Hbase 与 Hive 的对比

Hive

  1. 数据仓库,方便使用HQL管理查询,存储结构化数据
  2. 用于离线数据分析、清洗,延迟较高
  3. 基于HDFS、MapReduce,数据存储在DataNode,HQL语句转换为MR代码执行
    Bbase
  4. 数据库,但不支持SQL
  5. 用于存储结构化和分结构化 的数据
  6. 基于HDFS,数据持久化存储的体现形式是 Hfile,存放于 DataNode 中,被 ResionServer以 region 的形式进行管理。
  7. 延迟较低,接入在线业务使用
    面对大量的企业数据,HBase 可以直线单表大量数据的存储,同时提供了高效的数据访问
    速度。

热点问题

原理

每张表会被划分为多个region,实际上这些region会被平均分配到多个节点上,如果某个时间点有大量的请求都落在某个单一的region上,则会加重该节点的负担,严重导致死机。

解决方案

  1. 加前缀:按照ASCII码一个前缀最多能有128种字节,可以根据业务需求限制随机范围,128种前缀对应128个节点随机分配。
  2. hash变化:将行键按照固定规则进行转换,同一个行键会被转换为同一个hash值,可以避免业务行键常见的前缀大量相同的问题
  3. 行键反转:对行键连续性要求不高时可以使用,失去有序性。
  4. 预写分区也可以有效解决热点问题

Hbash高可用

HMaster通过zk保持对外单服务,RS则通过Hlog保证意外宕机时内存数据丢失恢复。
RS意外宕机时,HMaster首先把原本分配该节点的region分配给其他节点,然后尝试读取宕机节点的Hlog,将数据写入region。
读取日志进行恢复的机制随版本不断变化,一开始是性能最低的LogSplitting机制,后来用Distributed Log Splitting机制,最后是Distributed Log Replay机制。

Hbase优化

行键

唯一原则:列式存储,K-v形式,必须有行键,保证唯一性
长度原则:长度尽量小,控制在byte的整数倍(二进制存储),
散列原则:尽量将数据分散在多个region中,避免region热点问题

列簇

长度尽量小,最好单字节。
数量尽量少,控制在2个以内。

协处理器 Coprocessor

0.92版本之后支持协处理器,可以为表锂钩子代码,当条件符合时自动触发钩子,大幅降低用户端的维护难度
例如:可以利用协处理器建立Hbase的耳机索引。创建一个类继承观察者类,重写其中的preput方法,在插入数据到本表前会先执行该方法,自定义地将数据插入到索引表。打包上传到hdfs,用hbase shell命令加载该写处理器到表中。

布隆过滤器

Bloom Filter 是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集
合,并能判断一个元素是否属于这个集合。
Bloom Filter 的这种高效是有一定代价的:在判
断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合
(false positive)
Bloom Filter 不适合那些“零错误”的应用场合。而在能容忍低错
误率的应用场合下,Bloom Filter 通过极少的错误换取了存储空间的极大节省。

预分区

提前划分region,避免单节点region一次性写入大量数据频繁分裂

其他优化

内存优化
关闭自动刷写
增加写入缓存
不用Wal
压缩传输
设置最大版本数
设置生命周期

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值