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过滤的范围查询
相关推荐
环能jvav大师几秒前
基于R语言的统计分析基础:使用SQL语句操作数据集
开发语言·数据库·sql·数据分析·r语言·sqlite
骆晨学长20 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
@月落26 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
楠枬36 分钟前
MySQL数据的增删改查(一)
数据库·mysql
goTsHgo41 分钟前
从底层原理上解释 clickhouse 保证完全的幂等性
数据库·clickhouse
阿华的代码王国2 小时前
MySQL ------- 索引(B树B+树)
数据库·mysql
Hello.Reader3 小时前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯3 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
yanglamei19623 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
工作中的程序员3 小时前
ES 索引或索引模板
大数据·数据库·elasticsearch