HBase非关系型数据库

HBase非关系型数据库

  • [1 什么是HBase](#1 什么是HBase)
  • [2 HBase的特点](#2 HBase的特点)
  • [3 什么时候需要HBase](#3 什么时候需要HBase)
  • [4 HBase的数据模型](#4 HBase的数据模型)
  • [5 HBase架构](#5 HBase架构)
    • [5.1 架构](#5.1 架构)
    • [5.2 HBase如何列式储存](#5.2 HBase如何列式储存)
  • [6 如何正确设计RowKey](#6 如何正确设计RowKey)

1 什么是HBase

HBase -- Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库。HBase是一个NoSQL数据库,把数据存在HDFS上,低成本来存储海量的数据并且支持高并发随机写和实时查询。
HBase 的原型: Google 的 BigTable 论文

2 HBase的特点

大:一个表可以有数百亿行,百万列;

无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;

面向列:面向列(族)的存储和权限控制,列(族)独立检索;

稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;

数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;

数据类型单一:HBase中的数据都是字符串,没有类型;

3 什么时候需要HBase

为海量数据而生,在需要实时读写、随机访问超大规模数据集时,可以使用HBase。但是不支持随机修改,查询效率低,对小文件支持不友好。

其他储存为什么不行?

MySQL是单机的。MySQL能存储多少数据,取决于那台服务器的硬盘大小。

Kafka可以存储很大的数据,且是分布式的(很方便的扩展)。但是持久化了的数据,最常见的用法就是重新设置offset,做「回溯」,无法单独查询某个数据。

Redis是缓存数据库,所有的读写都在内存中,速度快。AOF/RDB存储的数据都会加载到内存中,Redis不适合存大量的数据(因为内存太贵了!)

Elasticsearch是一个分布式的搜索引擎,主要用于检索。理论上Elasticsearch也是可以存储海量的数据(分布式),我们也可以将数据用『索引』来取出来。但是如果我们的数据没有经常「检索」的需求,其实不必放到Elasticsearch,数据写入Elasticsearch需要分词,无疑会浪费资源。

每个column family存储在HDFS上的一个单独文件中,空值不会被保存。Row Key 和 Version number在每个 column family中均有一份;

HBase 为每个值维护了多级索引,即:<Rowkey, column family, column name, timestamp>。逻辑数据模型中空白cell在物理上是不存储的,因为根本没有必要存储,但是,如果不指明时间,将会返回最新时间的行,每个最新的都会返回。

4 HBase的数据模型

HBase表的每一行中,列的组成都是灵活的,行与行之间的列不需要相同,一个列族下可以任意添加列,不受任何限制:

数据写到HBase的时候都会被记录一个时间戳,这个时间戳被我们当做一个版本。比如说,我们修改或者删除某一条的时候,本质上是往里边新增一条数据,记录的版本加一了而已。在读的时候按照时间戳读最新的记录。在外界「看起来」就是把这条记录改了。

HBase本质上其实就是Key-Value的数据库,Key由RowKey(行键)+ColumnFamily(列族)+Column Qualifier(列修饰符)+TimeStamp(时间戳--版本)+KeyType(类型)组成,而Value就是实际上的值。

5 HBase架构

5.1 架构

1、Client客户端,它提供了访问HBase的接口,并且维护了对应的cache来加速HBase的访问。

2、Zookeeper存储HBase的元数据(meta表),无论是读还是写数据,都是去Zookeeper里边拿到meta元数据告诉给客户端去哪台机器读写数据

3、HRegionServer它是处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点。

大致的流程:client请求到Zookeeper,然后Zookeeper返回HRegionServer地址给client,client得到Zookeeper返回的地址去请求HRegionServer,HRegionServer读写数据后返回给client。

4、写数据的时候是先写到内存(见下面的Store内),为了防止机器宕机,内存的数据没刷到磁盘中就挂了。我们在写Mem store的时候还会写一份HLog。

5、HMaster会处理 HRegion 的分配或转移。如果我们HRegion的数据量太大的话,HMaster会对拆分后的Region重新分配RegionServer。(如果发现失效的HRegion,也会将失效的HRegion分配到正常的HRegionServer中)HMaster会处理元数据的变更和监控RegionServer的状态。

  • RegionServer 为 Region 的管理者,其实现类为 HRegionServer,主要作用如下:
    1. 对于数据的操作:get, put, delete;
    2. 对于 Region 的操作:splitRegion、compactRegion。
  • Master 是所有 RegionServer 的管理者,其实现类为 HMaster,主要作用如下:
    1. 对于表的操作:create, delete, alter
    2. 对于 RegionServer的操作:分配 regions 到每个 RegionServer,监控每个 RegionServer 的状态,负载均衡和故障转移。
  • Zookeeper 通过 Zookeeper 来做 Master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。
  • HDFS 为 HBase 提供最终的底层数据存储服务,同时为 HBase 提供高可用的支持。

5.2 HBase如何列式储存

  • HRegion
    HBase一张表的数据会分到多台机器上。用RowKey来切分到不同的HRegionHRegion属于某个HRegionServer,一个HRegionServer可以有多个HRegion)
  • Store
    HRegion下面有Store,一个列族的数据存储在一个Store

所以,在物理存储层面,一个列族的数据是存储在一起的 -- HBase是基于列族存储的。

  • Store
    HBase在写数据的时候,会先写到MemStore,当MemStore超过一定阈值,就会将内存中的数据刷写到硬盘上,形成StoreFile,而StoreFile底层是以HFile的格式保存,HFile是HBase中KeyValue数据的存储格式。
    所以说:MemStore我们可以理解为内存 buffer,HFile是HBase实际存储的数据格式,而StoreFile只是HBase里的一个名字。

6 如何正确设计RowKey

RowKey是会按字典序排序的,我们HBase表会用RowKey来横向切分表。无论是读和写我们都是用RowKey去定位到HRegion,然后找到HRegionServer。定位HRegionServer的时候,实际上就是定位我们这个RowKey在不在这个HRegion的start-key和end-key范围之内,如果在,说明我们就找到了。

在HBase里边提供了三种的查询方式:

  1. 全局扫描
  2. 根据一个RowKey进行查询
    对RowKey散列,分配到HRegion的时候就比较均匀,要避免热点的问题。
  3. 根据RowKey过滤的范围查询
相关推荐
小蜗牛慢慢爬行17 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger20 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud42 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡44 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0071 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名1 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb
呼啦啦啦啦啦啦啦啦3 小时前
【MySQL篇】事务的认识以及四大特性
数据库·mysql