NoSQL与HBase:大数据时代的超级收纳术
一、先来认识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的三大神奇之处:
-
海量存储:能存几十亿、几百亿条记录
-
灵活扩展:随时可以增加新的“列”,不用像SQL那样先修改表结构
-
快速查询:通过“行键”可以快速找到某一行数据
四、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的“小缺点”
-
不适合复杂事务:不能像银行系统那样保证“要么全成功,要么全失败”
-
学习成本高:需要理解Hadoop生态,不像MySQL那么简单
-
不适合小数据:就像用航母运快递——大材小用
十、总结:什么时候用HBase?
用HBase,当...
-
数据量特别大(TB、PB级别)
-
需要快速随机读写(比如查某个用户的订单)
-
数据结构经常变化(经常要新增字段)
-
不需要复杂的事务和关联查询
用传统SQL,当...
-
数据量不大(GB级别)
-
需要复杂查询和关联(比如报表统计)
-
需要严格的事务保证(比如银行转账)
-
数据结构稳定不变
最后的比喻
传统SQL数据库像图书馆:
-
每本书都有固定位置(索书号)
-
借书必须登记(事务)
-
找相关书籍需要查目录(关联查询)
HBase像快递分拣中心:
-
海量包裹(数据)不断涌入
-
按地区(行键)快速分拣
-
随时可以新增分拣规则(新的列)
-
目标是快速找到某个包裹,而不是分析所有包裹的关系
在大数据时代,HBase就是那个能处理每天数亿包裹的“智能分拣中心”,而NoSQL则是各种新型仓储技术的总称。
HBase的安装与配置
实验目的
- 了解HBase的安装流程和基本配置方法;
- 理解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安装与基本测试完成!
更多推荐
所有评论(0)