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过滤的范围查询
相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼1 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码3 小时前
【SQL实验】触发器
数据库·笔记·sql