手把手带你玩转大数据“超级硬盘”
建议授课时长:90 分钟 | 纯实操演练
从修改配置到拉起集群,搭建我们的第一座 HBase 数据基地。
告别鼠标,用极客的方式与 HBase 对话,实现数据的增删改查。
趣味实战考核!用今天学到的绝招,完成数据收录任务。
纸上得来终觉浅,绝知此事要躬行。
让我们一步步把 HBase 集群拉起来!
代号:通讯员/保安
它是 HBase 的“大管家”,负责记录集群里谁活着、谁挂了,并维护核心元数据。
*必须第一个启动!
代号:底层大仓库
HBase 自己是不存数据的,所有的数据最终都存在 HDFS 这个巨型文件系统里。
*必须第二个启动!
代号:核心指挥部
负责提供表结构、处理高并发查询,是今天实操的绝对主角。
*最后压轴出场!
打开终端,输入启动命令并检查状态:
zkServer.sh start
zkServer.sh status
*看到 Mode: standalone 就说明启动成功啦!
接着,把底层仓库拉起来:
start-dfs.sh
*HBase 只依赖 HDFS,不需要启动 YARN。
cd /opt/module/hbase/conf首先编辑 hbase-env.sh 文件,告诉 HBase Java在哪里,以及谁来管 Zookeeper。
# 1. 配置 JAVA 环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_212
# 2. 禁用 HBase 自带的 Zookeeper(我们用自己装的)
export HBASE_MANAGES_ZK=false
易错点:false 千万别拼错,否则启动会冲突!
这是 HBase 的“大脑”,要告诉它 HDFS 的地址和 Zookeeper 的地址。
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:8020/hbase</value> <!-- 你的HDFS地址 -->
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value> <!-- 开启分布式模式 -->
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value> <!-- 你的ZK集群地址 -->
</property>
start-hbase.sh
运行后,系统会自动启动 Master 和 RegionServer。
敲下 jps 命令,必须看到以下两个新进程,才算成功:
新手常见翻车现场排查:
/opt/module/hbase/logs 目录下找带 .log 结尾的文件,里面的 ERROR 就是答案。
基地建好了,现在我们要开始干活了。
敲下命令,亲自感受数据的增删改查。
在终端里敲击下面这个命令,我们将进入 HBase 的交互式世界:
hbase shell
当你看到提示符变成 hbase(main):001:0> 时,恭喜你,连接成功!
(提示:按 Ctrl+Backspace 可以退格删除打错的字哦)
命名空间就相当于 MySQL 里的 Database,是一个逻辑上的文件夹。
实操任务:我们来创建一个名为 school 的命名空间。
# 1. 创建空间
create_namespace 'school'
# 2. 查看所有空间
list_namespace
需要两个列族:info (存基础信息) 和 score (存成绩)。
create 'school:student', 'info', 'score'
# 查看所有的表
list
# 查看这个表的详细结构
desc 'school:student'
HBase 是一格一格填数据的。我们来给学号为 s1001 的同学录入信息。
# 填入姓名:张三
put 'school:student', 's1001', 'info:name', 'ZhangSan'
# 填入年龄:20
put 'school:student', 's1001', 'info:age', '20'
# 填入大数据课成绩:95
put 'school:student', 's1001', 'score:bigdata', '95'
*大家注意看引号!表名、RowKey、列族:列名、值,全部都要加单引号!
我想看看 s1001 这个学生到底录入了哪些信息?
get 'school:student', 's1001'
*你会看到控制台打印出了张三的 name, age 和 bigdata 三条记录(3个Cell)。
如果我只想看张三的“成绩”,不想看“基础信息”呢?
get 'school:student', 's1001', 'score'
在后面加参数,可以精准定位到列族甚至具体的列!
为了演示 Scan,请大家花 1 分钟,快速用 put 命令录入一个 s1002 的李四同学(随便写点数据)。
scan 'school:student'
如果表里有十亿条数据,全表 Scan 会死机。我们可以限制只看前 1 条数据:
scan 'school:student', {LIMIT => 1}
注意大括号里的语法,LIMIT 是大写!
哎呀,张三的年龄录错了。我们把它删掉:
delete 'school:student', 's1001', 'info:age'
执行完再 get 一下,发现年龄确实没了。
李四 (s1002) 退学了,要把他的所有数据全部干掉:
deleteall 'school:student', 's1002'
再 scan,表里就只剩张三了。
表里可能有几万条数据,我不知道 RowKey,我只想找到名字叫 'ZhangSan' 的所有记录。
scan 'school:student', {FILTER => "ValueFilter(=, 'binary:ZhangSan')"}
代码解析:在扫描的时候加一个“安检门”,只有值等于(binary) "ZhangSan" 的数据才会被放行显示出来。
最后,如果我们不要这张表了,该怎么删?
理论课讲过:必须“先停用,再删除”!
大家可以自己敲一遍试试,然后用 list 看看表是不是没了。
离开机房前,请养成好习惯,不要直接拔电源,否则下次 HDFS 容易损坏!在终端执行:
# 1. 退出 shell
exit
# 2. 关闭 HBase
stop-hbase.sh
只要自己敲出代码,大数据就不再神秘。