岚殿的技术博客 岚殿的技术博客
首页
Java
  • docker
  • hbase
  • 提示词工程
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

岚殿

首页
Java
  • docker
  • hbase
  • 提示词工程
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • docker

  • hbase

    • hbase-入门
      • 是什么
      • 为什么
      • 概念
        • 列式存储
        • 基本概念
      • 架构
        • HRegionServer
    • hbase-原理
  • 技术学习
  • hbase
lan-dian
2024-04-10
目录

hbase-入门

# 是什么

Hbase是一个分布式数据库,可以存储互联网的海量数据。 HBase是在HDFS的基础之上构建的,HDFS是分布式文件系统。 可以支持千万的QPS、PB级别的存储。

# 为什么

为什么不是MySql

HBase的 关系数据库管理系统(RDBMS)
HBase是无架构的,它没有固定列架构的概念;仅定义列族。 RDBMS由其架构控制,该架构描述表的整个结构。
它是为宽表而设计的。HBase是水平可伸缩的。 它很薄,专为小表而建。难以扩展。
HBase中没有事务。 RDBMS是事务性的。
它具有非规范化的数据。 它将具有标准化的数据。
对于半结构化数据和结构化数据都非常有用。 这对结构化数据很有用。

因为Mysql无法存储互联网的海量数据,只能使用NoSql的解决方案。

为什么不是ES

因为ES的成本比较好,支持了分词等等逻辑,主要用在搜索领域,远高于我们的需求。

为什么不是HDFS

HDFS HBase
HDFS是适用于存储大文件的分布式文件系统。 HBase是建立在HDFS之上的数据库。
HDFS不支持快速的单个记录查找。 HBase为大型表提供快速查找。
它提供高延迟的批处理;没有批处理的概念。 它提供了数十亿条记录对单行的低延迟访问(随机访问)。
它仅提供数据的顺序访问。 HBase在内部使用哈希表并提供随机访问,并且将数据存储在索引的HDFS文件中,以加快查找速度。

HDFS是一个分布式的文件系统,他可以存储海量的数据,但是功能太底层,不方便我们去操作。


HBase可以以低成本来存储海量的数据并且支持高并发随机写和实时查询。

# 概念

# 列式存储

面向行的数据库 列式数据库
它适用于在线事务处理(OLTP)。 它适用于在线分析处理(OLAP)。
此类数据库设计用于少量的行和列。 面向列的数据库是为大型表设计的。

我们可以对比的去学习,MySQL是行存储,每一行有一个id,然后有若干字段。那列式存储,从形式上来看,就是就是把一行拆分开,每一行只有一个id和一个字段。 这样做有什么好处吗,为什么要这么做? 首先,在MySQL中如果有的字段为空,或者有的一列字段很多重复的,都会照成空间的浪费,如果是列式存储的话,这些空间都是可以压缩的。而且一个id对应一个字段这样的结构,就是NoSql最典型的k-v结构。

# 基本概念

表

首先,Hbase里面也有表的概念这个和Mysql是一样的

行键(RowKey)

这个其实就是id

列族

一个列族下面有多个列

区别于MySql,有了列族的概念,而且行与行之间不需要相同的列。数据写到HBase的时候都会被记录一个时间戳,这个时间戳被我们当做一个版本。比如说,我们修改或者删除某一条的时候,本质上是往里边新增一条数据,记录的版本加一了而已。

# 架构

Client客户端,它提供了访问HBase的接口,并且维护了对应的cache来加速HBase的访问。 Zookeeper存储HBase的元数据(meta表),无论是读还是写数据,都是去Zookeeper里边拿到meta元数据告诉给客户端去哪台机器读写数据。 HRegionServer它是处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点。

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

# HRegionServer

很明显的,这个Server肯定是核心的内容。

HRegion

HBase一张表的数据会分到多台机器上的。用的就是RowKey来切分,其实就是表的横向切割。一个HRegionServer上面管理了多个HRegion,存储了HBase表的一部分数据。

Store

HRegion下面有Store,那Store是什么呢?我们前面也说过,一个HBase表首先要定义列族,然后列是在列族之下的,列可以随意添加。 一个列族的数据是存储在一起的,所以一个列族的数据是存储在一个Store里边的。

Store内部

HBase在写数据的时候,会先写到Mem Store,当MemStore超过一定阈值,就会将内存中的数据刷写到硬盘上,形成StoreFile,而StoreFile底层是以HFile的格式保存,HFile是HBase中KeyValue数据的存储格式。 MemStore的作用不是为了加快写速度,而是为了对Row Key进行排序。

Hlog

这里看到了内存写入,我们学过MySQL原理的同学肯定第一时间就想到了内存有丢失的风险,同理,Hbase在解决这个问题的时候,也是通过一个顺序写日志的方式解决的,也就是HLog。顺序写磁盘,直接写内存,批量持久化内存,所以说性能还是非常高的。 在HBase中,每个RegionServer只需要维护一个WAL,所有Region对象共用一个WAL,而不是每个Region都维护一个WAL。这种方式对于多个Region的更新操作所发生的的日志修改,只需要不断地追加到单个日志文件中,不需要同时打开并写入多个日志文件,这样可以减少磁盘寻址次数,提高写性能。

HMaster

到这里我们还有一个最关键的点不知道,HRegion到底是怎么划分的呀,具体是谁管理的,那么这个时候就需要一个Master来管理了。 首先,读写请求都不经过Hmaster,只是为了管理。HMaster会处理 HRegion 的分配或转移。如果我们HRegion的数据量太大的话,HMaster会对拆分后的Region重新分配RegionServer。(如果发现失效的HRegion,也会将失效的HRegion分配到正常的HRegionServer中) Master只负责各种协调工作,比如建表、删表、移动Region、合并等操作。这些操作有一个共性的问题:就是需要跨RegionServer。所以,HBase就将这些工作分配给了Master服务。这种结构的好处是大大降低了集群对Master的依赖。而Master节点一般只有一个到两个,一旦宕机,如果集群对Master的依赖度很大,那么就会产生单点故障问题。在HBase中即使Master宕机了,集群依然可以正常地运行,依然可以存储和删除数据。

编辑 (opens new window)
#笔记
上次更新: 2024/04/24, 11:31:27
docker-原理
hbase-原理

← docker-原理 hbase-原理→

最近更新
01
设计模式
04-22
02
提示词工程
04-14
03
hbase-原理
04-10
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式