一、先来认识NoSQL:不只是“不SQL”

想象一下,你有一个超级大的玩具箱,里面放着各种形状的玩具:

  • 乐高积木(结构规整,可以按图纸搭建)

  • 橡皮泥(可以捏成任何形状)

  • 拼图碎片(需要组合才能看到完整画面)

  • 各种毛绒玩具(每个都独一无二)

传统SQL数据库就像那个只放乐高积木的箱子——所有积木都必须按照固定的格子分类存放,每个格子都有严格的标签。如果要放一个新形状的积木,必须重新设计整个箱子的格子!

NoSQL数据库则像一个大大的玩具房,你可以:把橡皮泥随便放在哪个角落,拼图暂时堆在桌子上,毛绒玩具扔在沙发上,乐高积木还是放在箱子里。

NoSQL = Not Only SQL(不仅仅是SQL),它是一种更灵活的数据管理方式!

二、NoSQL的四种“玩具收纳法”

类型

像什么

特点

常见例子

键值存储

学校的储物柜

每个柜子(键)对应一个物品(值),简单快速,但不知道柜子里具体有什么

Redis, DynamoDB

文档存储

每个人的书包

每个书包里装不同的东西(书本、文具、零食…),每个书包内部结构可以不一样

MongoDB, CouchDB

列族存储

超市的货架

按商品类别摆放(饮料区、零食区),方便批量取同一类商品

HBase, Cassandra

图数据库

人际关系网

记录谁是谁的朋友、同学、亲戚,擅长处理复杂关系

Neo4j

三、主角登场:HBase是什么?

HBase = Hadoop Database,是建立在Hadoop之上的列族数据库。

用一个班级花名册来理解HBase:

假设你是班主任,要记录全班同学的信息:

传统SQL表(固定表格)

| 学号 | 姓名 | 语文成绩 | 数学成绩 | 英语成绩 |
|------|------|----------|----------|----------|
| 001  | 张三 | 85       | 90       | 88       |
| 002  | 李四 | 92       | 85       | 90       |

HBase的存储方式(灵活扩展)

表:学生信息表
行键:学号_001
列族:基本信息
    列:姓名 → 值:张三
    列:性别 → 值:男
列族:成绩
    列:2024_语文_期中 → 值:85
    列:2024_数学_期中 → 值:90
    列:2024_英语_期中 → 值:88
    列:2024_语文_期末 → 值:88  (可以随时新增!)
    列:2024_数学_期末 → 值:92  (不需要改表结构!)

HBase的三大神奇之处:

  1. 海量存储:能存几十亿、几百亿条记录

  2. 灵活扩展:随时可以增加新的“列”,不用像SQL那样先修改表结构

  3. 快速查询:通过“行键”可以快速找到某一行数据

四、HBase的“家族关系图”

Hadoop(大数据基地)
          |
          |—— HDFS(存储中心:存放所有数据)
          |
          |—— HBase(数据库:快速读写HDFS中的数据)
          |
          |—— Hive(翻译官:用SQL查询HBase/HDFS)

简单理解:

  • HDFS是巨型仓库,存取速度较慢,但能存海量数据

  • HBase是仓库里的智能货架,能快速找到你要的东西

  • Hive是仓库管理员,你说“我要2024年所有语文成绩”,它帮你从HBase里整理出来

五、HBase vs. 传统SQL:足球赛比喻

场景

传统SQL数据库

HBase

球队管理

固定阵容:必须明确11个位置,每个位置1个人

灵活阵容:可以随时增加新位置,比如“左边锋的替补的替补”

比赛数据

只能记录预设的数据:进球、助攻、黄牌

可以记录任何突发数据:“第35分钟擦汗次数”、“第78分钟系鞋带时间”

数据量

适合一场比赛的数据

适合整个赛季所有比赛+训练+采访的所有数据

查询速度

查某个球员的数据:很快

查某个球员在雨天比赛的数据:很快

扩展性

增加新统计项需要重建球场

增加新统计项就像增加一个记分牌

六、HBase在实际生活中的应用

案例1:微信聊天记录

  • 你每天发的消息、图片、表情包都存在HBase里

  • 为什么能快速找到几个月前的某条消息?因为HBase按时间+用户ID高效存储

  • 为什么群聊图片不会丢?因为HBase能存海量小文件

案例2:电商网站

  • 淘宝的商品信息、用户浏览记录、购物车

  • “猜你喜欢”就是通过分析HBase里你的历史数据计算的

  • 双十一每秒几十万订单,HBase能快速处理

案例3:物联网传感器

  • 智能手环每秒都在记录你的心率、步数

  • 这些数据量太大,传统数据库存不下

  • HBase可以轻松存下全球几亿用户24小时不间断的数据

七、技术核心:HBase如何做到这么快?

1. 按行键排序存储

就像字典按字母排序,找单词很快。HBase的所有数据都按“行键”排序,找数据时用“二分查找”,非常快。

2. 列族存储

把相关的列放在一起(比如所有“成绩”放一起,所有“基本信息”放一起)。查询时只需要读取相关的列族,不用读整行数据。

3. 区域分区

当表太大时,自动切分成多个“区域”,分布在不同服务器上。就像把大仓库分成多个小房间,多人同时找东西互不干扰。

4. 内存+磁盘结合

最近访问的数据放在内存(快),旧数据放在磁盘(省空间)。就像你的书桌:常用的书放桌上,不常用的放书架。

八、动手体验:如果用HBase记录班级日志

假设我们要记录每天班级情况,体验一下HBase的灵活性:

第一天:基础信息


表名:class_daily_log
行键:20240430_grade3_class2
列族:basic_info
    列:weather → 值:晴
    列:head_teacher → 值:王老师
    列:class_status → 值:正常
列族:attendance
    列:late_zhangsan → 值:08:15
    列:absent_lisi → 值:感冒请假
列族:score
    列:chinese_midterm → 值:85
    列:math_midterm → 值:90
    列:english_midterm → 值:88

第二天:新增卫生检查(不需要修改表结构!)


行键:20240501_grade3_class2
列族:basic_info
    列:weather → 值:雨
    列:head_teacher → 值:王老师
列族:attendance
    列:late_wangwu → 值:08:20
列族:score
    列:chinese_final → 值:88
    列:math_final → 值:92
// 新增列族:卫生检查
列族:hygiene_check
    列:classroom → 值:优
    列:personal → 值:全部合格
    列:blackboard → 值:整洁

传统SQL的限制对比:


-- 传统SQL需要预先定义表结构
CREATE TABLE class_log (
    id INT PRIMARY KEY,
    log_date DATE NOT NULL,
    weather VARCHAR(20),
    head_teacher VARCHAR(50),
    class_status VARCHAR(50)
    -- 必须预先定义所有可能的列!
);

-- 如果要增加“卫生检查”字段
-- 必须修改表结构:
ALTER TABLE class_log 
ADD COLUMN hygiene_classroom VARCHAR(10),
ADD COLUMN hygiene_personal VARCHAR(10),
ADD COLUMN hygiene_blackboard VARCHAR(10);

九、HBase的“小缺点”

  1. 不适合复杂事务:不能像银行系统那样保证“要么全成功,要么全失败”

  2. 学习成本高:需要理解Hadoop生态,不像MySQL那么简单

  3. 不适合小数据:就像用航母运快递——大材小用

十、总结:什么时候用HBase?

用HBase,当...

  • 数据量特别大(TB、PB级别)

  • 需要快速随机读写(比如查某个用户的订单)

  • 数据结构经常变化(经常要新增字段)

  • 不需要复杂的事务和关联查询

用传统SQL,当...

  • 数据量不大(GB级别)

  • 需要复杂查询和关联(比如报表统计)

  • 需要严格的事务保证(比如银行转账)

  • 数据结构稳定不变

最后的比喻

传统SQL数据库图书馆

  • 每本书都有固定位置(索书号)

  • 借书必须登记(事务)

  • 找相关书籍需要查目录(关联查询)

HBase快递分拣中心

  • 海量包裹(数据)不断涌入

  • 按地区(行键)快速分拣

  • 随时可以新增分拣规则(新的列)

  • 目标是快速找到某个包裹,而不是分析所有包裹的关系

在大数据时代,HBase就是那个能处理每天数亿包裹的“智能分拣中心”,而NoSQL则是各种新型仓储技术的总称。

HBase的安装与配置

实验目的
  1. 了解HBase的安装流程和基本配置方法;
  2. 理解HBase的工作原理及其在Hadoop生态系统中的定位。
实验原理

HBase是一个分布式的、面向列的开源数据库,其技术灵感来源于Google的著名论文《Bigtable:一个结构化数据的分布式存储系统》。与传统的关系型数据库不同,HBase专为非结构化或半结构化数据设计,采用基于列而非基于行的存储模式。它特别适合需要实时读写和随机访问超大规模数据集的场景。

在Hadoop生态系统中,HBase位于结构化存储层。Hadoop HDFS 为其提供高可靠性的底层存储支持,Hadoop MapReduce 提供高性能的计算能力,ZooKeeper 则负责协调服务和故障切换(failover)。此外,Pig和Hive为其提供了高层查询语言支持,Sqoop则方便地将传统RDBMS中的数据导入HBase。

HBase架构简述: HBase Master负责管理所有的HRegion,但不实际存储数据。逻辑表被划分为多个HRegion,分布存储在HRegionServer集群中。数据操作会先记录在HLog中,读取时优先访问缓存(MemStore),缓存未命中再从HStore(由多个HStoreFile组成,底层为B+树结构)中查询。

实验环境
  • 操作系统:Linux Ubuntu 16.04
  • JDK版本:jdk-7u75-linux-x64
  • Hadoop版本:hadoop-2.6.0-cdh5.4.5
  • HBase版本:hbase-1.0.0-cdh5.4.5

(前提:已完成Hadoop的安装与启动)

实验步骤

步骤1:下载HBase安装包

在Linux本地新建目录用于存放安装文件:

mkdir -p /data/hbase1
cd /data/hbase1

使用wget下载安装包(根据你的实际内网地址替换):

wget http://192.168.1.150:60000/allfiles/hbase1/hbase-1.0.0-cdh5.4.5.tar.gz

输入输出示例

  • 输入:上述wget命令
  • 输出:下载进度条,完成后显示文件已保存。

步骤2:解压并重命名

将安装包解压到/apps目录:

tar -xzvf /data/hbase1/hbase-1.0.0-cdh5.4.5.tar.gz -C /apps
cd /apps
mv hbase-1.0.0-cdh5.4.5 hbase

步骤3:配置HBase环境变量

编辑用户环境变量文件:

sudo vim ~/.bashrc

在文件末尾追加以下内容:

# hbase
export HBASE_HOME=/apps/hbase
export PATH=$HBASE_HOME/bin:$PATH

使配置生效并验证:

source ~/.bashrc
hbase version

输入输出示例

  • 输入:hbase version
  • 输出示例:
    HBase 1.0.0-cdh5.4.5, ...
    Source code repository ...
    Compiled ...

步骤4:配置hbase-env.sh

进入配置目录:

cd /apps/hbase/conf
vim hbase-env.sh

追加以下配置:

export JAVA_HOME=/apps/java
export HBASE_MANAGES_ZK=true
export HBASE_CLASSPATH=/apps/hbase/conf

配置说明

  • JAVA_HOME:指定Java安装路径;
  • HBASE_MANAGES_ZK=true:让HBase管理自带的ZooKeeper(单机测试常用);
  • HBASE_CLASSPATH:指向HBase配置文件路径。

步骤5:配置hbase-site.xml

vim hbase-site.xml

在<configuration>与</configuration>之间插入以下内容:

XML

<property>
    <name>hbase.master</name>
    <value>localhost</value>
</property>
<property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:9000/hbase</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>localhost</value>
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/data/tmp/zookeeper-hbase</value>
</property>

配置项说明

  • hbase.master:HBase Master节点地址;
  • hbase.rootdir:HBase数据在HDFS上的存储路径;
  • hbase.cluster.distributed:是否启用分布式模式;
  • hbase.zookeeper.quorum:ZooKeeper服务器地址;
  • hbase.zookeeper.property.dataDir:ZooKeeper数据存储目录。

提前创建并设置权限:

sudo mkdir -p /data/tmp/zookeeper-hbase
sudo chown -R zhangyu:zhangyu /data/tmp/zookeeper-hbase

步骤6:配置RegionServers

vim /apps/hbase/conf/regionservers

将内容修改为(单机模式):

localhost

步骤7:启动HBase

先检查Hadoop是否启动:

jps

若未启动,则启动Hadoop:

cd /apps/hadoop/sbin
./start-all.sh

启动HBase:

cd /apps/hbase/bin
./start-hbase.sh

步骤8:验证安装

再次查看进程:

jps

预期输出(部分关键进程):

... HMaster
... HRegionServer
... HQuorumPeer
... NameNode
... DataNode
...

进入HBase Shell进行测试:

hbase shell

在Shell中执行:

list

输入输出示例

  • 输入:list
  • 输出:当前HBase中的表列表(初始为空)。

创建测试表并验证:

create 'tb', 'mycf'
list

预期输出

TABLE
tb
1 row(s) in 0.XXXX seconds

至此,HBase安装与基本测试完成!

更多推荐