Hadoop Part 8 - 部署 HBase 和 HBase 常用操作

2021-05-20
6分钟阅读时长

【版本】

当前版本号v20220411

版本修改说明
v20220411增加配置修正HMaster消失的问题
v20210601修正文件夹拷贝的命令错误和一些标点符号的错误
v20210520初始化版本

实验8.1 - 部署 HBase 完全分布式

【实验目的】

  • 部署 HBase 完全分布式

【实验环境】

  • Windows 7 以上64位操作系统
  • JDK8
  • Hadoop 3
  • CentOS 7

【实验资源】

  • HBase 1.X
链接:https://pan.baidu.com/s/1MoQ0iU0Qb1o8_o5JV6X6iw 
提取码:3rno

【实验内容】

  • 部署 HBase 完全分布式

【实验步骤】

  1. 在NodeA、NodeB、NodeC三个节点分别运行以下语句,创建 HBase 的安装目录。
sudo mkdir /opt/hbase
sudo chown hadoop:wheel /opt/hbase
  1. 使用 hadoop 登录NodeA节点。
su hadoop
  1. 上传 HBase 安装包hbase-1.6.0-bin.tar.gz 到 NodeA 节点 /home/hadoop 目录。

  2. 解压hbase-1.6.0-bin.tar.gz/home/hadoop 目录。

tar -xvf hbase-1.6.0-bin.tar.gz
  1. 把解压以后的目录移到安装目录
sudo mv ~/hbase-1.6.0/* /opt/hbase
  1. 提升 root 用户权限执行以下语句,加入 HBase 环境变量。
su
echo "export HBASE_HOME=/opt/hbase
export PATH=\$HBASE_HOME/bin:\$PATH:." >>/etc/profile
  1. 切换会 hadoop 用户
su hadoop
  1. 使环境变量生效。
source /etc/profile
  1. 编辑 HBase 的环境配置脚本。
cd $HBASE_HOME/conf
vim hbase-env.sh
  1. 在第1行加入
export JAVA_HOME=/opt/jdk8
  1. 在约128行,设置启用Zookeeper
export HBASE_MANAGES_ZK=true
  1. 保存 hbase-env.sh。

  2. 备份并编辑 HBase 配置文件 hbase-site.xml

cd $HBASE_HOME/conf
cp hbase-site.xml{,.bak}
vim hbase-site.xml
  1. 输入以下内容,注意替换你的学号后3位。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!--HBase 的数据保存在 HDFS 对应目录 -->
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://nodea你的学号后3位:8020/hbase</value>
    </property>
    <!-- 是否是分布式环境 -->
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <!-- 配置 ZK 的地址 ,3 个节点都启用 ZooKeeper-->
    <property>
        <name>hbase.zookeeper.quorum</name>
		<value>nodea你的学号后3位,nodeb你的学号后3位,nodec你的学号后3位</value>
    </property>
    <!-- 冗余度 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <!-- 主节点和从节点允许的最大时间误差 -->
    <property>
        <name>hbase.master.maxclockskew</name>
        <value>180000</value>
    </property>
    <!--zookeeper 数据目录 -->
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/opt/hbase/zookeeper</value>
    </property>
	<property>
	    <name>hbase.unsafe.stream.capability.enforce</name>
	    <value>false</value>
	</property>
</configuration>
  1. 编辑Region Server的配置文件regionservers
cd $HBASE_HOME/conf
vi regionservers
  1. 清空文件内容,加入以下内容并保存。注意替换你的学号后3位。
nodea你的学号后3位
nodeb你的学号后3位
nodec你的学号后3位
  1. 同步 HBase 安装目录内容到 NodeB 和 NodeC。注意替换为你的学号后3位。
rsync -r /opt/hbase nodeb你的学号后3位:/opt
rsync -r /opt/hbase nodec你的学号后3位:/opt

rsync 是文件同步命令,可以用于本机和远程之间的文件同步 如果没有安装,可以使用 yum install rsync 安装

  1. 启动 HDFS 和 HBase。
start-dfs.sh
start-hbase.sh

【实验验证步骤】

  1. 在 NodeA、NodeB 和 NodeC 3个节点分别输入jps。
jps
  1. 查看其中1个节点是否存在以下进程
HRegionServer
HQuorumPeer
HMaster
  1. 另外2个节点存在以下进程。
HQuorumPeer
HRegionServer

实验8.2 通过 HBase Shell 访问 HBase

【实验目的】

掌握 HBase Shell 常用指令的使用。

【实验环境】

  • Windows 7 以上64位操作系统
  • JDK8
  • Hadoop 3
  • CentOS 7

【实验资源】

  • Hadoop 3.X
  • HBase 1.X

【实验内容】

  • 按要求使用 HBase Shell 访问 HBase

【实验步骤】

  1. 启动 HBase
start-dfs.sh
start-hbase.sh
  1. 启动 HBase Shell。
hbase shell
  1. 执行命令前,请大家注意在hbase shell 下删除字符需要同时按下 ctrl+Backspace

  2. 查询服务器状态。

status
  1. 查询 HBase 版本。
version
  1. 查看所有表。
list
  1. 增、删、改 注意:为了避免冲突,下面的表名命名规则为 member + 学号,比如学号 +学号,表名为 member+学号。
  • 创建一个Rowkey是会员名的会员表。
create 'member+学号后3位','member_id','address','info'
  • 获得表的描述。
describe 'member+学号后3位'
  • 添加一个列族id。
alter 'member+学号后3位', 'id'
  • 再次查询表的结构,是否多了一个id。
describe 'member+学号后3位'
  • 添加数据。在 HBase Shell 中,我们可以通过 put 命令来插入数据。列族下的列不需要提前创建,在需要时通过:来指定即可。添加数据如下:
put 'member+学号后3位', 'debugo','id','11'
put 'member+学号后3位', 'debugo','info:age','27'
put 'member+学号后3位', 'debugo','info:birthday','1991-04-04'
put 'member+学号后3位', 'debugo','info:industry', 'it'
put 'member+学号后3位', 'debugo','address:city','Shanghai'
put 'member+学号后3位', 'debugo','address:country','China'
put 'member+学号后3位', 'Sariel', 'id', '21'
put 'member+学号后3位', 'Sariel','info:age', '26'
put 'member+学号后3位', 'Sariel','info:birthday', '1992-05-09'
put 'member+学号后3位', 'Sariel','info:industry', 'it'
put 'member+学号后3位', 'Sariel','address:city', 'Beijing'
put 'member+学号后3位', 'Sariel','address:country', 'China'
put 'member+学号后3位', 'Elvis', 'id', '22'
put 'member+学号后3位', 'Elvis','info:age', '26'
put 'member+学号后3位', 'Elvis','info:birthday', '1992-09-14'
put 'member+学号后3位', 'Elvis','info:industry', 'it'
put 'member+学号后3位', 'Elvis','address:city', 'Beijing'
put 'member+学号后3位', 'Elvis','address:country', 'china'
  • 查看表数据。
scan 'member+学号后3位'
  • 删除一个列族。
alter 'member+学号后3位', {NAME => 'member_id', METHOD => 'delete' }
  • 通过 delete 命令,我们可以删除行键是’debugo’记录的’info:age’字段,再用 get 获取’info:age’字段的值,会发现已经没有值了,命令如下。
delete 'member+学号后3位','debugo','info:age'
get 'member+学号后3位','debugo','info:age'
  • 删除整行的值,用 deleteall 命令:
deleteall 'member+学号后3位','debugo'
get 'member+学号后3位','debugo'
  • 通过 enable 和 disable 来启用/禁用这个表,相应地可以通过 is_enabled 和 is_disabled 来检查表是否被启用/禁用。
is_enabled 'member+学号后3位'
is_disabled 'member+学号后3位'
  • 使用 exists 来检查表是否存在。
exists 'member+学号后3位'
  • 删除表前需要先将表 disable。
disable 'member+学号后3位'
drop 'member+学号后3位'
  1. 查询
  • 查询表中有多少行,用 count 命令。
count 'member+学号后3位'
  • get 命令。获取一个 ID 的所有数据。
get 'member+学号后3位', 'Sariel'
  • get 命令。获得一个 ID 下一个列簇(一个列)中的所有数据。
get 'member+学号后3位', 'Sariel', 'info'
  • 查询整表数据。
scan 'member+学号后3位'
  • 扫描整个列簇。
scan 'member+学号后3位', {COLUMN=>'info'}
  • 扫描其中指定的某个列。
scan 'member+学号后3位', {COLUMNS=> 'info:birthday'}
  • 除了列(COLUMNS)修饰词外,HBase 还支持 LIMIT(限制查询结果行数),STARTROW (ROWKEY 为起始行,会先根据这个 KEY 定位到 Region,再向后扫描)、STOPROW(结束行)、 TIMERANGE(限定时间戳范围)、VERSIONS(版本数)、FILTER(按条件过滤行)等。比如 我们从 Sariel 这个 ROWKEY 开始,找下一个行的最新版本,代码如下。
scan 'member+学号后3位', { STARTROW => 'Sariel', LIMIT=>1, VERSIONS=>1}
  • Filter 是一个非常强大的修饰词,可以设定一系列条件来进行过滤。比如我们要限制某个列的值等于 26。
scan 'member+学号后3位', FILTER=>"ValueFilter(=,'binary:26')"
  • 值包含 6 这个数字的过滤指令:
scan 'member+学号后3位', FILTER=>"ValueFilter(=,'substring:6')"
  • 列名中的前缀为 birth 的过滤指令:
scan 'member+学号后3位', FILTER=>"ColumnPrefixFilter('birth') "
  • FILTER 支持多个过滤条件(通过括号、AND 和 OR 的条件组合)。
scan 'member+学号后3位', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:1988')"
  • PrefixFilter 对 ROWKEY 的前缀进行判断,这是一个非常常用的功能。
scan 'member+学号后3位', FILTER=>"PrefixFilter('E')"