HBase 数据库核心原理与应用

面向大数据的海量、列式分布式存储系统

本节课学习地图

1

HBase 破冰初识

为什么需要它?它能解决什么痛点?以及典型的应用场景。

2

HBase 核心原理

底层是怎么运转的?奇妙的“列式存储”数据模型解析。

3

Shell 操作解析

不敲代码也能懂!提前解析 HBase 的“工作黑话”与指令逻辑。

第一模块:HBase 简介

在关系型数据库“吃不消”的时代,
HBase 是如何作为超级英雄登场的?

痛点回顾:传统数据库的烦恼

MySQL 的“天花板”

大家在之前学过 MySQL,它像是一个非常严谨的表格管理员。但是当面对真实世界的大数据时,它遇到了麻烦:

  • 🖱️ 刮开查看数据量太大:单表几千万条数据就卡顿了。
  • 🖱️ 刮开查看并发读写高:每秒几十万次请求,它承受不住。
  • 🖱️ 刮开查看结构经常变:今天加一列明天减一列,改表极其痛苦。

思考时间

如果微信朋友圈要把全国人民(十几亿用户)每天发的状态都存下来,用传统的行列表格(MySQL)能存得下吗?查询快吗?


点击揭晓最终答案

答案是:极其困难。我们需要一种全新的存储思路!

什么是 HBase?

Hadoop Database的简称

HBase 是一个高可靠性高性能面向列可伸缩的分布式存储系统。


它不擅长做复杂的逻辑运算,但它极其擅长“海量数据的快速存取”

HBase 的核心标签解析

1. 面向列 (Column-Oriented)

传统的数据库是“按行”存数据的。而 HBase 是“按列族”存储的。

  • 好处: 如果表里有 100 列,但我只需要查其中的 2 列,HBase 不需要把整行数据都读出来,极大节省了内存和时间

2. 高可靠性与可伸缩性

HBase 运行在 Hadoop 集群之上。

  • 可伸缩: 数据存不下了?直接加买一台电脑(节点)插进集群,存储空间自动变大!
  • 高可靠: 数据默认存多份,一台机器坏了,数据依然在。

HBase 对比 MySQL

特性 MySQL (关系型) HBase (NoSQL)
数据规模 百万级 ~ 千万级 十亿级 ~ 百亿级
数据类型 丰富 (int, varchar, date...) 统一为 Byte 字节数组 (纯粹)
事务支持 强 (支持复杂多表事务) 弱 (仅支持单行事务)
表结构修改 困难,牵一发而动全身 极其灵活,随时增加列

HBase 的应用场景大盘点

搜索引擎数据

百度的网页库。全网有成百上千亿个网页,每个网页有标题、正文、链接。


HBase 负责将这些海量网页快速存下来,供爬虫和检索调用。

物联网(IoT)时序数据

全国的新能源汽车,每隔 5 秒钟就要向云端发送一次定位和电池温度数据。


数据源源不断,HBase 写入速度极快,且支持海量累加。

用户画像与推荐系统

淘宝、抖音等 APP 会记录你每一个点击、停留时间。你的“标签”会不断增加。


HBase 灵活的“无结构列”,非常适合存储这种经常变化的画像标签。

什么时候【不该】用 HBase?

HBase 不是万能药!

理解一个技术的缺点,才能说明你真正懂它。遇到以下情况,千万别用 HBase:

  • 数据量很小: 几万条数据用 HBase,纯属“高射炮打蚊子”,光是启动集群的时间都比查询长。
  • 需要复杂的表间连接 (Join): HBase 极度缺乏 Join 计算能力,如果有复杂的关联查询,还是得靠 MySQL。
  • 需要金融级强事务: 银行转账等业务,绝不能用 HBase。

第二模块:HBase 基本原理

在这个部分,我们要拆解 HBase 的“大脑”和“骨架”。
它是怎么把千亿级数据管理的井井有条的?

HBase 的基本架构概念

HBase 不是一个单一的软件,它是一个团队。我们可以把它想象成一个大型的物流仓库

仓库主管:HMaster

不直接干活,负责分配任务,监控各个小弟(机器)是否正常工作,管理表结构的修改。

搬砖工人:HRegionServer

真正干活的人。负责数据的读写、存储,直接和客户(客户端)进行对接。

通讯员/保安:Zookeeper

维持集群稳定。如果某个工人罢工了,它会立刻通知主管。

底层基石

为什么 HBase 离不开 HDFS

刚才提到的 HRegionServer (工人) 虽然负责管理数据,但数据最终存放在哪里呢?

🖱️ 刮开查看

答案是:Hadoop 的分布式文件系统 (HDFS)

  • HBase 提供高并发的表状查询接口。
  • HDFS 提供底层的、海量的硬盘存储能力。
  • 两者结合,就是“带了强力搜索引掣的超级大硬盘”。

核心重头戏:HBase 数据模型

忘记你在 MySQL 里学到的那些死板的行和列。
欢迎来到 HBase 的立体数据世界!

概念 1:Row Key (行键) - 重中之重

什么是 Row Key?

它是数据行的唯一标识。就像咱们学生的“学号”,或者超市商品的“条形码”。

  • 一段任意的字符串,最大长度 64KB(通常我们只用几十个字节)。
  • 在 HBase 内部,所有数据都是根据 Row Key 来找的。
  • 重中之重:HBase 内部的数据是按照 Row Key 的“字典顺序”自动排序的!

字典顺序示例

如果存入学号:202301, 202303, 202302,HBase 底层会自动排成:

  1. 202301
  2. 202302
  3. 202303

(注:这种排序使得相似的数据放在一起,查询非常快。)

概念 2:Column Family (列族)

什么是列族?

HBase 里面,不是所有的列都平铺在一起,而是把意思相近的列,打包放进一个“列族”中。

  • 可以把它看作是“文件夹”
  • 创建表的时候,必须指明列族。
  • 一个表最好不要超过 3 个列族(会影响性能)。

举个生动的例子

我们有一张“学生表”:

  • 列族 1:基础信息 (base_info)
    • 里面包含列:姓名、性别、年龄
  • 列族 2:成绩信息 (score_info)
    • 里面包含列:语文、数学、大数据基础

概念 3:Column Qualifier (列限定符)

什么是列限定符?

既然列族是“文件夹”,那么列限定符就是文件夹里面的“具体文件”(也就是我们常说的“列名”)。

在 HBase 中,定位一列必须带上列族的名字。格式为:

列族名 : 列限定符

  • 例如:base_info:name (基础信息里的姓名)
  • 例如:score_info:math (成绩里的数学)

列限定符的“魔力”:动态扩展

与 MySQL 最大的不同点在于:

  • 在 MySQL 中,如果要加一门“Java”课的成绩列,必须通过 ALTER TABLE 修改全表的结构。
  • 在 HBase 中,列限定符是随时可以增加的,不需要改表结构!
  • 今天你可以往 score_info 列族里塞个 math,明天可以直接塞个 java,后天塞个 python,极其自由。

这就叫“无模式”(Schema-less)的灵活性。

视觉辅助:核心概念图解

HBase 核心概念大图

概念 4:Timestamp (时间戳)与多版本

时光机功能

在 HBase 中,当你修改一个数据时,旧数据并不会立刻被覆盖消失!

HBase 会利用时间戳 (Timestamp) 将它们存为不同的“版本”。

  • 默认情况下,时间戳就是数据写入时的时间。
  • 查询时,默认返回最新时间戳的数据。
  • 你可以手动设定保留多少个历史版本(比如保留最近的 3 次修改记录)。

概念 5:Cell (单元格)

数据的最终归宿:Cell

在一个具体的单元格 (Cell) 中,数据其实是没有类型的,统统被视为字节数组 (Byte[])


要精确找到某一个格子里的某个版本的数据,需要一套“四维坐标”:

[ Row Key, Column Family, Column Qualifier, Timestamp ]

(行键,列族,列名,时间戳) -> 唯一确定一个值!

概念视图 vs 物理视图

我们脑补的视图 (概念视图)

看起来像一个有很多空洞的 Excel 表格。有的学生有 Java 成绩,有的没有,没有的地方看起来是空的 (Null)。

计算机眼中的视图 (物理视图)

在底层硬盘上,HBase 是一种“稀疏”的存储。没有值的地方,根本就不占用空间!

这就是为什么它存几十亿条数据,哪怕有很多空白列,也不会浪费硬盘的原因。

第三模块:HBase Shell 理论解析

怎么和 HBase 对话?
本节专注理解指令的逻辑,不涉及真机实操,掌握“沟通语法”即可。

什么是 HBase Shell?

HBase 的命令行控制台

就像在 Windows 里按 cmd 弹出的黑窗口一样,HBase 提供了一个 Shell 工具。

  • 它基于 JRuby 语言编写。
  • 是管理员管理表、查数据最简单、最直接的工具。
  • 语法简单,全是纯文本命令。

命名空间 (Namespace) 的概念

类比学习法

在 MySQL 中,我们会建很多个 Database (数据库) 来区分不同的项目,比如商城数据库、教务数据库。

在 HBase 中,没有 Database 这个词,取而代之的概念叫 Namespace (命名空间)


  • 它本质上就是一个逻辑上的表分组
  • 把商城相关的表放在商城命名空间,把教务表放在教务命名空间,防止名字冲突。
  • 系统自带两个特殊的空间:hbase (系统表) 和 default (默认空间)。

命名空间的基本操作口令

1. 查看所有命名空间

list_namespace

顾名思义,列出当前系统里有多少个“大文件夹”。

2. 创建命名空间

create_namespace 'ns1'

创建一个名叫 'ns1' 的新空间。注意要加单引号。

3. 删除命名空间

drop_namespace 'ns1'

注意:只有当命名空间里面是空的(没有表)时,才能被删除。

进入核心:表 (Table) 的操作

建表是存数据的第一步。
思考:在 HBase 中建表,最关键的要素是什么?

答案:表名 + 列族名

创建表 (create)

语法结构

create '表名', '列族1', '列族2'...

案例解释:

假设我们要建一张学生表,包含基础信息和成绩信息两个列族:

create 'student', 'info', 'score'

注意:不需要像 MySQL 那样定义字段类型(int/varchar),只要定好列族即可!

列出表 (list) 与查看详情 (desc)

查看当前有哪些表

list

这个命令会展示数据库中所有的表名,供你核对。

查看某张表的详细结构

describe 'student'

或者简写为 desc 'student'

它会列出这个表的列族信息、版本数量限制、压缩方式等底层属性。

删除表的“两步走”战略

重点:HBase 表不能直接删除!

为了防止误删核心数据,HBase 规定:删除表之前,必须先让表“下线(停用)”


  1. 第一步:停用表
    disable 'student'
  2. 第二步:删除表
    drop 'student'

(补充:如果想重新启用表,可以使用 enable 'student')

数据 CRUD 核心指令

CRUD:Create(增), Read(查), Update(改), Delete(删)
让我们看看 HBase 是如何填装弹药的。

添加与修改数据 (put)

在 HBase 中,增加数据和修改数据使用的是同一个命令put

逻辑是:如果这个位置没数据,就是新增;如果有数据,就用新的时间戳覆盖它(增加新版本)。

语法结构:填空题

put '表名', 'RowKey', '列族:列名', '具体的值'

实战解释:给学号为 1001 的学生,添加名字叫张三。

put 'student', '1001', 'info:name', 'zhangsan'

注:HBase 每次 put 只能插入一个单元格(Cell)的数据。不能像 MySQL 一下子插一整行。

精确查询 (get)

get:精准打击的狙击枪

get 命令专门用于:已知 Row Key (行键),去获取这一行的数据。速度极快!


语法:

get '表名', 'RowKey'


示例:获取 1001 学生的全部信息

get 'student', '1001'

范围查询 (scan)

scan:扫荡战场的雷达

如果我们不知道 Row Key,或者想看全表的数据,就要用到 scan 扫描。


全表扫描(慎用,数据量大时会卡死):

scan 'student'


范围扫描(推荐):限制起止 RowKey

scan 'student', {STARTROW => '1001', STOPROW => '1005'}

(注:包含 STARTROW,但不包含 STOPROW,即左闭右开区间)

删除数据 (delete / deleteall)

delete:精确删格

删除某个单元格(某一行中具体某一列)的数据。

delete '表', '行键', '列族:列'

例如:抹去 1001 学生的数学成绩。

deleteall:霸道删行

直接把这一行(RowKey 对应的所有列族、所有列)全部干掉。

deleteall '表', '行键'

例如:1001 学生退学了,清空他的所有记录。

进阶:HBase 过滤器

如果不能像 MySQL 那样写 WHERE age > 18
HBase 怎么做复杂的条件查询?

为什么需要过滤器?

问题引入

HBase 默认只能通过 RowKey 搜索。如果我想找“所有姓张的学生”或者“成绩大于 90 分的学生”,怎么办?全表 scan 后拿到客户端再挑拣吗?

这样太耗费网络带宽了!

过滤器的作用

过滤器 (Filter) 就是 HBase 为了解决复杂查询发明的机制。它允许在服务端 (RegionServer) 提前按照条件把数据过滤好,只把符合要求的数据返回给客户端。

常见的过滤器类型 (理论了解)

1. 行键相关过滤器

  • PrefixFilter (前缀过滤器): 非常实用!比如筛选出 RowKey 以 "2023" 开头的所有学生。
  • RowFilter: 使用比较运算符(>,<,=)等对 RowKey 进行全量比对。

2. 列与值相关过滤器

  • FamilyFilter / QualifierFilter: 专门针对列族名或列名进行过滤。
  • ValueFilter (值过滤器): 核心工具!用于匹配具体的单元格数据,比如找到所有值为 "zhangsan" 的记录。相当于 MySQL 中的 WHERE value = 'zhangsan'

课程大总结

今天我们学习了 HBase 的哪些核心心法?

  • 定位: 高并发、海量数据的面向列 NoSQL 数据库,不擅长事务,强于存储。
  • 骨架: Master 管调度,RegionServer 搬砖,Zookeeper 当保安,HDFS 当仓库。
  • 灵魂数据模型: RowKey 是王道,列族是文件夹,可以动态增加列,支持时间戳多版本。
  • 沟通语言 (Shell): 了解了 namespace,表操作 (create/disable/drop),以及 CRUD 的核心四将 (put/get/scan/delete)。

感谢大家的聆听!

理论知识需要沉淀,
下节课我们将进入机房进行实操演练

Q & A 答疑时间