实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

19
实验 1 HBase 的部署与基本操作 一、实验目的 (一)理解 HBase 拓扑结构 (二)完成 HBase 的下载、安装,掌握 HBase 配置方法 (三)能够使用命令实现 HBase 的基本操作和过滤器操作 (四)了解 HBase 批处理操作 二、实验环境 CentOSJDKHadoopHBase 三、实验内容 1HBase 部署与配置 2HBase Shell 操作 3、表和列族操作 4、数据更新 5、数据查询 6、过滤查询 7、批处理

Transcript of 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

Page 1: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

实验 1 HBase 的部署与基本操作

一、实验目的

(一)理解 HBase 拓扑结构

(二)完成 HBase 的下载、安装,掌握 HBase 配置方法

(三)能够使用命令实现 HBase 的基本操作和过滤器操作

(四)了解 HBase 批处理操作

二、实验环境

CentOS、JDK、Hadoop、HBase

三、实验内容

1、HBase 部署与配置

2、HBase Shell 操作

3、表和列族操作

4、数据更新

5、数据查询

6、过滤查询

7、批处理

Page 2: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

四、实验原理

(一)Hadoop 核心组件

1.Hadoop 核心组件包括

1)HDFS:分布式文件系统(原型为谷歌的 GFS)

2)YARN:分布式资源管理

3)MapReduce:分布式计算框架(原型为谷歌的 MapReduce)

2.主要扩展组件与功能描述

Hive:分布式数据仓库

HBase:分布式 NoSQL 数据库

Spark 、Tez:分布式计算引擎

Flume:数据采集

Sqoop:和关系型数据库进行数据互转

Oozie/hue:工作流、可视化操作

Ambari/Cloudera Manager/Fusion Insight:集成化解决方案

Mahout:分布式数据挖掘

Pig:通过简化的数据操作语言执行 MapReduce 操作

Page 3: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

Zookeeper:分布式协调服务

(二)HBase 概述

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式数据库。利用HBase

技术可在廉价 PC Server 上搭建起大规模结构化存储集群。

HBase 是非关系型数据库,它不要求数据之间有严格的关系,同时它允许在

同一列不同行中存储不同类型的数据。HBase 作为 Hadoop 框架下的数据库,是

被设计成在一个服务器集群上运行的。

1.HBase 的特点

1)原理来自于谷歌公司的 Bigtable

2)分布式、面向列、键值对 NoSQL 数据库

3)底层采用 HDFS,不需要自行解决底层存储问题

4)可以实现数据的分布式存储、统一管理

5)可以实现数据条目的随机增删改

6)可以实现大数据的实时查询

2.和关系型数据库对比

1)无模式(无表结构)、数据结构简单

2)无法实现事务、多表查询等机制

3)可以存储多个“版本”的数据

4)分布式存储、易扩展

5)面向列的存储模式,更适合存储稀疏数据

3.和其他 NoSQL 数据库相比

1)实际需要部署 HDFS+HBase,甚至 Zookeeper 等组件,部署过程相对复

Page 4: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

2)大数据的(简单)查询功能出色

3)和 MapReduce、Spark 等大数据处理工具配合良好

4)采用主从式架构

5)应用广泛、扩展组件很多

(三)HBase 的数据模型

1.固定元素:

1)表名

2)列族名:面向“列”的概念,这里体现为列族,需要在建表时提前建立,

也可以通过表管理指令新建列族、删除列族或修改属性,实际存储时,不同列族

存储为 HDFS 上的不同文件

2.随数据建立的元素:

1)行键(key):每行数据的唯一标识,数据存储时,用行键进行局部排序

2)列名(列标识符,Column qualifier):每行所涉及的列名可以各不相同,

或者说每个表中,可能存在成千上万的列名

3)时间戳(Timestamp):时间转化为 Long 型整数

4)值(value):每个值对应一组行键名、列名和时间戳

3.实际存储方式

每个物理行只有一个行键和列标识符(即表中的 Name)

(四)HBase 的拓扑结构

1.主从结构:Hmaster 和 Hregionrever

2.底层采用 HDFS:可以复用节点共同部署 HDFS 和 HBase,但节点无必然对应

Page 5: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

关系,如:Datanode 节点不一定是 Hregionrever 节点

3.利用 Zookeeper 集群实现节点监控、活跃主节点选举、配置维护等功能。HBase

自带一个 Zookeeper 组件,也可以使用外部的 Zookeeper 服务。

4.HMaster 节点是所有 Hregionrever 的管理者,负责对 Hregionrever 的管理范围

进行分配,但不负责管理用户数据表。

5.Hregionrever 是用户数据表的实际管理者,在分布式集群中,数据表会进行水

平分区,每个 Hregionrever 只会对一部分分区进行管理——负责数据的写入、查

询、缓存和故障恢复等。用户表最终是以文件形式存储在 HDFS 上,但如何将写

入并维护这些文件,则是由 Hregionrever 负责的。

(五)HBase 过滤器

在 HBase 中,Get 和 Scan 操作都可以使用过滤器来设置输出的范围,类似

于 SQL 里面的 Where 查询条件。使用 show_filter 命令可以查看当前 HBase 支持

的过滤器类型:

使用上述过滤器时,一般需要配合比较运算符或比较器共同使用,如下图所

示:

Page 6: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

使用过滤器的语法格式如下所示:

scan '表名',{Filter => ”过滤器(比较运算符,’比较器’)”}

上述语法中,Filter=>指明过滤的方法,整体可用大括号引用,也可以不用

大括号。过滤的方法使用双引号引用,而比较方式用小括号引用。

(六)HBase 快照原理

1.简介

HBase 快照(snapshot)顾名思义就是在某个时刻对某个 HBase 表的数据做

了快速备份,就像拍照一下,让数据停留在那个时刻不再变动,后面用来做数据

的恢复或者迁移。HBase 在 0.94 版本开始提供了快照功能,0.95 版本以后默认

开启快照功能。

HBase 的 snapshot 其实就是一组 metadata 信息的集合(文件列表),通过

这些 metadata 信息的集合,就能将表的数据回滚到 snapshot 那个时刻的数据。

2. HBase 快照使用场景

简单概括 HBase 快照的使用场景如下:

1)HBase 表的定期快速备份

2)升级前的 HBase 数据备份

3)集群间的数据迁移

4)构建测试环境数据

5)做数据恢复

Page 7: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

3.HBase 快照的详细原理

在 HBase 中,数据是先写入到 Memstore 中,当 Memstore 中的数据达到

一定条件,就会 flush 到 HDFS 中,形成 HFile,后面就不允许原地修改或者删除

了。如果要更新或者删除的话,只能追加写入新文件。

既然数据写入以后就不会在发生原地修改或者删除,这就是 snapshot 做文

章的地方。做 snapshot 的时候,只需要给快照表对应的所有文件创建好指针(元

数据集合),恢复的时候只需要根据这些指针找到对应的文件进行恢复就 Ok。这

是原理的最简单的描述,下图是描述快照时候的简单流程:

由上图可以看出创建 snapshot 的流程主要分为 4 个步骤,分别是:

1)对该表添加全局锁,不允许任何数据的写入、更新和删除

2)将该表内存中的数据(memstore)flush 到 HFile 文件中

3)为该表涉及的各个 region 中所有 HFile 文件创建引用指针,并记录到

snapshot 文件中

4)Hmaster 将所有的 region 的 snapshot 文件进行汇总形成总体的 snapshot

Page 8: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

文件

五、实验步骤

(一)HBase 的安装部署

1.安装

1)基础环境准备

在安装 HBase 之前,需要先安装好 Hadoop 和 JDK 基础环境。

2)将压缩包解压到制定目录(根据自己设置目录更改):

Tar –zxvf HBase-1.2.6-bin.tar.gz /use/local

3)将 HBase 目录重命名为 HBase(选做,可以忽略):

cd /user/local/ //切换目录

mv HBase-1.2.6 HBase //重命名文件夹

4)修改 HBase 环境变量,vi /etc/profile,添加内容(根据自己设置目录修

改):

export HBASE_HOME=/opt/HBase

export PATH=$PATH:$HBASE_HOME/bin

(5)验证是否安装成功,HBase version,如出现以下界面说明安装成功

[root@localhost ~]# HBase version

HBase 1.4.10

Source code repository git://apurtell-

ltm4.internal.salesforce.com/Users/apurtell/tmp/HBase-build-2

revision=76ab087819fe82ccf6f531096e18ad1bed079651

Compiled by apurtell on Wed Jun 5 16:48:11 PDT 2019

From source with checksum a4dd28b173ece8660fc5633796deb361

2.HBase 的配置

1)修改配置文件 HBase-env.sh,添加如下信息(添加 java 路径,根据自己

设置目录和 java 版本修改)

export JAVA_HOME=/home/mjq/soft/java/jdk1.8.0_191/ #JDK安装目

export HBASE_MANAGES_ZK=true #配置 HBase自带 zookeeper

Page 9: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

2)修改配置文件 HBase-site.xml,信息如下

<configuration>

<property>

<name>HBase.rootdir</name>

<value>file:///home/mjq/soft/HBase/HBase-

1.4.10/data</value>

</property>

<property>

<name>HBase.zookeeper.property.dataDir</name>

<value> home/mjq/soft/HBase/HBase-

1.4.10/data/zookeeper</value>

</property>

</configuration>

3. 启动 HBase

1)确认 HDFS 是运行的,启动 HDFS,start-all.sh

使用 jps 命令查看 Namenode 和 Datanode 的服务是否正常启动

启动 HBase

start hbase.sh

2)确认 HBase 是否启动

使用 jps 命令查看进程,在 master 节点运行有 Hmaster 和 HQuorumPeer 进

程,在 slave 节点上运行 HRegionServer 和 HQuorumPeer 进程。

[root@localhost ~]# jps

18467 HMaster

20291 Jps

19285 DataNode

19481 SecondaryNameNode

19770 NodeManager

20250 GetJavaProperty

19166 NameNode

20142 HQuorumPeer

3)停止 HBase:bin/stop-HBase.sh(要继续后面实验步骤,不用停止 HBase)

Page 10: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

(二)HBase 的基本操作

1.连接 HBase

使用 "HBase shell" 命令可以连接到正在运行的 HBase 实例.

2.查看 HBase Shell 中的帮助文档

在 HBase Shell 中输入 help 并按下回车键, 将会显示一些基本的使用信息

以及命令示例. 需要注意的是: 表名、行、列都必须使用引号括起来。

3.创建表。使用 create 命令可以创建一个新表, 必须要指定表明和列族名,基本

格式:

create 'table', 'column_family_1','column_family_2'...

例:

HBase(main):001:0> create 'test', 'cf'

0 row(s) in 1.7990 seconds

=> HBase::Table - test

4.列出表的信息

可以使用 list 命令列出 test 表的信息

HBase(main):002:0> list 'test'

TABLE

test

1 row(s) in 0.0530 seconds

=> ["test"]

5.修改表结构

Page 11: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

基本格式

增加列族

alter 'table','newCF'

删除列族

alter 'table','delete'=>'deleteCFname'

更改列族属性

alter 'table','CFname',{NAME=>'newName',IN_MEMORY=>true}

注:IN_MEMORY 表示激进缓存,具体将在 HBase 高级原理中讲解。

5.往表中插入数据

可以使用 put 命令往表中插入数据.

基本格式

put 'table', 'row key', 'column_family:column', 'value'

HBase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'

0 row(s) in 0.9960 seconds

HBase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'

0 row(s) in 0.0160 seconds

HBase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'

0 row(s) in 0.0170 seconds

插入了三行数据 , 第一行的 row key 是 row1, 列是 cf:a, 其值是

value1.HBase 中的列是由列族前缀, 冒号以及列名后缀组成。

6.一次扫描表中所有数据可以使用 scan 命令一次扫描 HBase 表中的所有数据。

HBase(main):006:0> scan 'test'

ROW COLUMN+CELL

row1 column=cf:a, timestamp=1468473020394, value=value1

row2 column=cf:b, timestamp=1468473053641, value=value2

row3 column=cf:c, timestamp=1468473079601, value=value3

3 row(s) in 0.0770 seconds

7.获取单行数据

可以使用 get 命令一次获取一行数据.基本格式

get 'table','rowkey'

HBase(main):007:0> get 'test', 'row1'

Page 12: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

COLUMN CELL

cf:a timestamp=1468473020394, value=value1

1 row(s) in 0.0770 seconds

8.禁用表

在某些情况下如果你想要删除表或是改变其设置, 需要先禁用表.可以使用

disable 命令禁用表, 稍后可以使用 enable 命令重新启用表.

HBase(main):008:0> disable 'test'

0 row(s) in 2.3740 seconds

HBase(main):009:0> enable 'test'

0 row(s) in 1.3380 seconds

9.删除表

在测试了 enable 命令之后再次禁用表, 接着使用 drop 命令删除表:

HBase(main):010:0> disable 'test'

0 row(s) in 2.3220 seconds

HBase(main):011:0> drop 'test'

0 row(s) in 1.3210 seconds

可以再次使用 list 命令查看表是否已经被删除.

HBase(main):012:0> list

TABLE

10.退出 HBase Shell

使用 quit 命令 HBase Shell, 但是 HBase 实例仍然在后台运行.

停止 HBase

bin/start-HBase.sh 脚本可以很方便的启动所有 HBase 守护进程, 同样的,

bin/stop-HBase.sh 脚本可以很方便的停止所有 HBase 守护进程。

$ stop-HBase.shstopping HBase

使用 jps 命令来确保 HMaster 和 HRegionServer 进程都已经关闭。

hadoop@master:~$ jps15730 Jps

(三)HBase 过滤器操作

在使用过滤器之前先创建这样的表结构:

Page 13: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

具体执行命令如下:

创建表:

create 'Student','StuInfo','Grades'

插入第一个逻辑行的数据:

put 'Student', '001', 'StuInfo:name','alice'

put 'Student', '001', 'StuInfo:age','18'

put 'Student', '001', 'StuInfo:sex','female'

put 'Student', '001', 'Grades:english','80'

put 'Student', '001', 'Grades:math','90'

同样插入其他两行数据,此处具体操作省略。

1.行键过滤器

包括 RowFilter、PrefixFilter、KeyOnlyFilter、FirstKeyOnlyFilter 等

格式:scan ‘表名’,{Filter =>“过滤器( 比较运算符,’比较器’)”}

1)RowFilter:针对行键进行过滤

例 1:显示行键前缀为 0 开头的键值对;

scan 'student',{FILTER=>"RowFilter(=,'substring:001')"}

例 2:显示行键字节顺序大于 002 的键值对;

scan 'student',FILTER=>"RowFilter(>,'binary:002')"

Page 14: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

2)PrefixFilter:行键前缀过滤器

例 3:扫描前缀为 001 的行键

scan 'student',FILTER=>"PrefixFilter('001')"

3)FirstKeyOnlyFilter:扫描全表,显示每个逻辑行的第一个键值对

例 4: scan 'student',FILTER=>"FirstKeyOnlyFilter()"

4)InclusiveStopFilter:替代 ENDROW 返回终止条件行;

例 5:扫描显示行键 001 到 002 范围内的键值对

scan 'student', {STARTROW =>'001',FILTER

=>"InclusiveStopFilter('002')"}

此条命令等同于:

scan 'student', {STARTROW =>'001',ENDROW => '003'}

Page 15: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

2.列族与列过滤器

1)FamilyFilter:针对列族进行比较和过滤。

例 1:显示列族前缀为 stu 开头的键值对;

scan 'student',FILTER=>"FamilyFilter(=,'substring:stu’)”

scan 'student',FILTER=>"FamilyFilter(=,‘binary:stu’)”

2)QualifierFilter:列标识过滤器。

例 2:显示列名为 name 的记录;

scan 'student',FILTER=>"QualifierFilter(=,'substring:name')"

Page 16: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

3)ColumnPrefixFilter:对列名前缀进行过滤。

例 2:显示列名为 name 的记录;

scan 'student',FILTER=>"ColumnPrefixFilter('name’)”

等价于 scan 'student',FILTER=>"QualifierFilter(=,'substring:name')"

4)MultipleColumnPrefixFilter:可以指定多个前缀

例 3:显示列名为 name 和 age 的记录;

scan

'student',FILTER=>"MultipleColumnPrefixFilter('name','age')"

5)ColumnRangeFilter :设置范围按字典序对列名进行过滤;

scan

'student',FILTER=>"ColumnRangeFilter('bi',true,'na',true)"

3.值过滤器

1)ValueFilter :值过滤器。

例 1:查询值等于 19 的所有键值对

scan 'student',FILTER=>"ValueFilter(=,'binary:19') "

scan 'student',FILTER=>"ValueFilter(=,'substring:19')

2)SingleColumnValueFilter :在指定的列族和列中进行值过滤器。

例 2:查询 stuinfo 列族 age 列中值等于 19 的所有键值对

scan

'student',{COLUMN=>'stuinfo:age',FILTER=>"SingleColumnValueFil

ter('stuinfo','age',=,'binary:19')"}

4.其他过滤器

1)ColumnCountGetFilter :限制每个逻辑行返回的键值对数

Page 17: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

例 1:返回行键为 001 的前 3 个键值对

get 'student','001',FILTER=>"ColumnCountGetFilter(3)"

2)PageFilter :基于行的分页过滤器,设置返回行数。

例 2:显示一行

scan 'student',FILTER=>"PageFilter(1)"

3)ColumnPaginationFilter :基于列的进行分页过滤器,需要设置偏移量与

返回数量 。

例 3:显示每行第 1 列之后的 2 个键值对

scan 'student',FILTER=>"ColumnPaginationFilter(2,1)"

(四)快照操作

1.配置 HBase-site.xml

<property>

<name>HBase.snapshot.enabled</name>

<value>true</value>

Page 18: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

</property>

2.创建快照基本格式

HBase> snapshot 'table', 'tablesnapshot'

HBase>list_snapshots

3.删除快照

delete_snapshot 'tablesnapshotname'

4.克隆快照

HBase> clone_snapshot 'tablesnapshot', 'newsnapshot'

5.restore 快照

HBase> disable 'table'

HBase> restore_snapshot 'myTableSnapshot-122112'

(五)批量操作

使用 importtsv:将 hdfs 中的结构化数据导入 HBase 中

1、默认情况下,hdfs 上的文件,是要以'\t'分隔的,例如

test.tsv

20170222_10001 column=info:name,

timestamp=1497059738675, value=tom

20170222_10002 column=info:name,

timestamp=1497059738956, value=jack

20170222_10003 column=info:name,

timestamp=1497059739013, value=leo

20170222_10004 column=info:name,

timestamp=1497059739121, value=peter

20170222_10005 column=info:name,

timestamp=1497059739254, value=jim

20170222_10006 column=info:name,

timestamp=1497059740585, value=zhangsan

$HADOOP_HOME/bin/yarn

jar $HBASE_HOME/lib/HBase-server-0.98.6-hadoop2.jar

importtsv

-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age,info:sex

stu_info /test.tsv

-》stu_info 为 HBase 上表名;test.tsv 为 hdfs 上文件

2、如果不是默认的\t,就要在语句中指定输入的分隔符,比如“,”

$HADOOP_HOME/bin/yarn

jar $HBASE_HOME/lib/HBase-server-0.98.6-hadoop2.jar

importtsv

Page 19: 实验 1 HBase 的部署与基本操作 - qn-sc0.yuketang.cn

-Dimporttsv.separator=,

-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age,info:sex

stu_info /test2.csv

-》Dimporttsv.separator 指定 hdfs 文件中的分隔符

3、completebulkload:大批量数据导入到 HBase 中

第一步:转换成 Ffile(其实就是 storeFile)

$HADOOP_HOME/bin/yarn

jar $HBASE_HOME/lib/HBase-server-0.98.6-hadoop2.jar

importtsv

-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age,info:sex

-Dimporttsv.bulk.output=/testHfile

stu_info /test3.tsv

-》Dimporttsv.bulk.output 输出到 hdfs 上,文件夹不需要手动创建

第二步:把 Hfile 导入 HBase

$HADOOP_HOME/bin/yarn

jar $HBASE_HOME/lib/HBase-server-0.98.6-hadoop2.jar

completebulkload

/testHfile stu_info

六、实验报告要求

实验报告以电子版形式提交。

实验报告主要内容包括实验名称、实验类型、实验地点、学时、实验环境、

实验原理、实验步骤、实验结果、总结与思考等。

七、实验成绩考核

实验成绩根据实验课的出勤、课堂表现、实验思考以及实验报告的书写情况

打分,按百分制,实验成绩的平均值按 30%比例计入课程总成绩。

附录:实验 2 参考代码