HBase总结

一、HBase简介

  HBase是面向列的分布式存储系统(NoSQL数据库),是对Google论文BigTable的实现,具有数据存储量大、高性能、高扩展等特点。(BigTable是对HBase最形象的解释,大宽表,支持百万级列、亿万级数据,动态列)

二、系统原理

2.1 数据模型

  HBase数据模型可以分为逻辑结构和物理结构。逻辑结构上,HBase的表由多行记录组成,每行由多个列簇组成,每个列簇由多个列组成;物理结构上,每张表按照RowKey被水平拆分成多个Region,每个Region按照Column Family被垂直拆分成多个Store(面向列存储的原因),每个单元格的数据由多个版本,按照KV存储,如下图所示:

  • RowKey:唯一表示一行记录;
  • Column Qualifier:创建表时只需要指定RowKey和Column Family,列是动态的,按需指定
  • Cell:<RowKey, Column Family, Column Qualifier>唯一确定的单元,每个单元格有多个版本,并且可以设置过期时间TTL;
  • TimeStamp:用于标识数据的不同版本,每条数据写入时可以指定数据版本,如果不指定默认使用系统当前时间;
  • Region:每个Region由多个Store组成,每个Store对应一个列簇;

在这里插入图片描述

2.2 系统架构

  HBase的架构为主从架构,HMaster为管理节点,负责元信息和集群管理;HRegionServer为数据节点,负责数据的管理,数据最终存储在HDFS上,如下图所示:
在这里插入图片描述
HMaster职责:

  1. HRegionServer节点管理(监控、Region分配和负载均衡等);
  2. 表元信息管理(DML相关),实际数据仍存储在HRegionServer;

HRegionServer职责:

  1. Region管理(拆分、压缩);
  2. 客户端数据读写请求处理(DDL相关);

Zookeeper职责:

  1. HMaster高可用(集群选主);
  2. 集群监控:HRegionServer的监控,上下线信息通报给HMaster;
  3. 元信息管理:Region路由信息、表元信息,以及集群配置信息等;

2.3 数据读写流程

1. Region寻址

  1. Client首先请求ZK,获取HBase的Meta表所在的HRegionServer;
  2. Client连接HRegionServer,获取Meta表信息,确定RowKey所属的Region,以及Region所在的HRegionServer;

2. 写流程

  1. 通过Region寻址,Client连接至对应的HRegionServer;
  2. 先将写命令写入HLog日志,然后将更新写入MemStore内存,写入成功后返回ACK到Client;
  3. 如果MemStore的大小超过设定阈值,刷盘到StoreFile;

在这里插入图片描述

3. 读流程

  1. 通过Region寻址,Client连接至对应的HRegionServer;
  2. 先从BlockCache(HRegionServer全局缓存,LRU算法)中查找数据,如果存在则返回;
  3. 如果不存在,则从RowKey所属的Region中的MemStore和StoreFile查找;

2.4 拆分与合并

1. Region拆分

  • 拆分原因: 单个Region的数据越来越多,会导致数据读取RT升高;
  • 拆分时机: Region中某个Store的数据量(所有StoreFile之和)超过设定阈值时触发拆分;
  • 拆分过程: 一个Region被拆分成两个,如果有负载均衡的需要,某个Region会被移到其他HRegionServer;
    在这里插入图片描述

2. StoreFile合并

  • 合并原因: StoreFile过多会导致数据读取RT升高;
  • 合并方式: 合并分为Minor Compaction和Major Compaction。Minor Compaction会将临近的若干个小文件合并成一个大文件,会清理过期数据,但是不会清理已删除数据;Major Compaction将Store下所有的文件合并成一个大文件,并且会清理和已删除数据。

2.5 批量导入

  基本原理:跳过HRegionServer,直接将数据转换成HFile格式,然后存储HBase对应的路径即可,如下图所示。
  使用场景:大批量数据的快速导入,绕开HRegionServer,避免写WAL、分裂合并等过程,性能是批量接口的几倍。
在这里插入图片描述

三、LSM树

  LSM树的核心思想内存加磁盘顺序写,将写性能达到最优。具体做法是将数据存储分为内存和磁盘两部分,数据的修改只需要更改内存中的数据即可,内存中使用有序数据结构称为Memtable,当内存中的数据达到设定阈值后,再批量顺序写到磁盘文件称为SSTable,后台周期性的对SSTable进行合并和数据压缩,为了防止内存数据丢失,更新内存Memtable前需要先写入WAL日志;(所有的写都是追加写入,只有当SSTable合并时,才会对数据整理)

读性能优化

1. 使用布隆过滤器快速判断数据是否存在;
2. 利用SSTable的有序性,文件的最大最小值知道,所有的SSTable在内存中创建稀疏索引,方便判断key存在于哪个SSTable;

三大索引结构

1. 哈希表。增删改查复杂度都是O(1),但是不适合范围查找,常用于内存KV存储,典型应用有Redis、Memcache;
2. B+树。增删改查复杂度为O(lgn),支持范围查找、顺序查找,存在随机写的问题,常见于MySQL等传统型关系数据库;
3. LSM树。通过内存和磁盘顺序写,写性能最优,读性能依赖于内存命中率,常见于HBase等NoSQL数据库中;

四、其它

1. 对比

对比关系型数据库: HBase能够支持海量数据的存储,并且容易扩展,但是不支持事务,二级索引,以及复杂查询;
对比Hive: 虽然都是基于HDFS,HBase是存储系统,提供低延迟的读写,用于在线业务;Hive是分析系统,用于大数据的离线分析;

2. 应用场景

  HBase作为分布式数据库,适用于海量数据存储(至少亿级别的数据量)场景(没有事务、复杂SQL等需求)。

3. RowKey设计原则

  • 长度原则:长度越短越好,建议不超过16Byte,数量大时极大的节约内存和磁盘空间;
  • 唯一原则:唯一标识一条数据;
  • 散列原则:确保数据能够均匀的分部到各RegionServer上;

参考

  1. 入门HBase的正确姿势
  2. 表及RowKey设计指南
  3. LSM Tree
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值