大数据技术之HBase
思考?
1. RegionServer和Master的区别?
DDL,DML
RegionServer实际存数据的地方,管理数据
Maser管理协调RegionServer,管理表
2. Hbase端口
服务端口: 16000
web端口: 16010
3. HBase写流程中,为什么要和zk进行交互?
第 1 章 HBase 简介
1.1 HBase 定义
HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。
1.2 HBase 数据模型
逻辑上,HBase 的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从 HBase 的底层物理存储结构(K-V)来看,HBase 更像是一个 multi-dimensional map。
1.2.1 HBase 逻辑结构
1.2.2 HBase 物理存储结构
1.2.3 数据模型
1)Name Space
命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。
2)Region
类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。
3)Row
HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组成,数据是按照 RowKey的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要。
4)Column
HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符)进行限定,例如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
5)Time Stamp
用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。
6)Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮。
1.3 HBase 基本架构
Hbase依赖Zk实现高可用
架构角色:
1)Region Server
Region Server 为 Region 的管理者,其实现类为 HRegionServer,主要作用如下:
对于数据的操作:get, put, delete;
对于 Region 的操作:splitRegion、compactRegion。
2)Master
Master 是所有 Region Server 的管理者,其实现类为 HMaster,主要作用如下:
对于表的操作:create, delete, alter
对于 RegionServer的操作:分配 regions到每个RegionServer,监控每个 RegionServer的状态,负载均衡和故障转移。
3)Zookeeper
HBase 通过 Zookeeper 来做 Master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。
4)HDFS
HDFS 为 HBase 提供最终的底层数据存储服务,同时为 HBase 提供高可用的支持。
第 2 章 HBase 快速入门
2.1 HBase 安装部署
2.1.1 Zookeeper 正常部署
首先保证 Zookeeper 集群的正常部署,并启动之:
[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkServer.sh start
2.1.2 Hadoop 正常部署
Hadoop 集群的正常部署并启动:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
2.1.3 HBase 的解压
解压 Hbase 到指定目录:
[atguigu@hadoop102 software]$ tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/module
配置环境变量
sudo vim /etc/profile.d/my_env.sh
#HABSE_HOME
export HBASE_HOME=/opt/module/hbase
export PATH=$PATH:$HBASE_HOME/bin
source /etc/profile
分发环境变量
[wanghaha@hadoop102 module]$ scp /etc/profile.d/my_env.sh root@hadoop103:/etc/profile.d
root@hadoop103's password:
my_env.sh
2.1.4 HBase 的配置文件
修改 HBase 对应的配置文件。
1)hbase-env.sh 修改内容:
[wanghaha@hadoop103 kafka]$ echo $JAVA_HOME
/opt/module/jdk1.8.0_212
export JAVA_HOME=/opt/module/jdk1.8.0_212
export HBASE_MANAGES_ZK=false
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
#export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
#export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
2)hbase-site.xml 修改内容:
默认端口号2181
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:8020/HBase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98 后的新变动,之前版本没有.port,默认端口为 60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper-3.5.7/zkData</value>
</property>
</configuration>
3)regionservers:
hadoop102
hadoop103
hadoop104
4)软连接 hadoop 配置文件到 HBase:
[atguigu@hadoop102 module]$ ln -s /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml /opt/module/hbase-1.3.1/conf/core-site.xml
[atguigu@hadoop102 module]$ ln -s /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml /opt/module/hbase-1.3.1/conf/hdfs-site.xml
2.1.5 HBase 远程发送到其他集群
[atguigu@hadoop102 module]$ xsync hbase/
2.1.6 HBase 服务的启动
1.启动方式
[atguigu@hadoop102 hbase]$ bin/hbase-daemon.sh start master
[atguigu@hadoop102 hbase]$ bin/hbase-daemon.sh start regionserver
提示:如果集群之间的节点时间不同步,会导致 regionserver 无法启动,抛出ClockOutOfSyncException 异常。
修复提示:
a、同步时间服务
请参看帮助文档:《尚硅谷大数据技术之 Hadoop 入门》
b、属性:hbase.master.maxclockskew 设置更大的值
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from
master</description>
</property>
2.启动方式 2
[atguigu@hadoop102 hbase]$ bin/start-hbase.sh
对应的停止服务:
[atguigu@hadoop102 hbase]$ bin/stop-hbase.sh
2.1.7 解决日志冲突
102,103,104
rm -rf /opt/module/hbase-1.3.1/lib/slf4j-log4j12-1.7.5.jar
2.1.8 查看 HBase 页面
启动成功后,可以通过“host:port”的方式来访问 HBase 管理页面,例如:
http://hadoop102:16010
2.1.9 高可用(可选)
在HBase中HMaster负责监控HRegionServer的生命周期,均RegionServer的负载,如果HMaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对HMaster的高可用配置。
1.关闭HBase集群(如果没有开启则跳过此步)
[atguigu@hadoop102 hbase]$ bin/stop-hbasel.sh
2.在conf目录下创建backup-masters文件
[atguigu@hadoop102 hbase]$ touch conf/backup-masters
3.在backup-masters文件中配置高可用HMaster节点
[atguigu@hadoop102 hbase]$ vim conf/backup-masters
hadoop103
[wanghaha@hadoop102 conf]$ vim hbase-env.sh
# File naming hosts on which backup HMaster will run. $HBASE_HOME/conf/backup-masters by default.
# export HBASE_BACKUP_MASTERS=${
HBASE_HOME}/conf/backup-masters
2.2 HBase Shell 操作
2.2.1 基本操作
1.进入 HBase 客户端命令行
[atguigu@hadoop102 hbase]$ bin/hbase shell
2.查看帮助命令
hbase(main):001:0> help
ctrl+backspace向后删
3.查看当前数据库中有哪些表
hbase(main):002:0> list
2.2.2 namespace操作
- 查看所有namespace
hbase(main):002:0> list_namespace
NAMESPACE
default
hbase
2 row(s) in 0.1430 seconds
可以通过help来查看用法,注意要用单引号
hbase(main):004:0> help 'create_namespace'
Create namespace; pass namespace name,
and optionally a dictionary of namespace configuration.
Examples:
hbase> create_namespace 'ns1'
hbase> create_namespace 'ns1', {
'PROPERTY_NAME'=>'PROPERTY_VALUE'}
- 创建
hbase(main):005:0> create_namespace 'mydb1'
0 row(s) in 0.9400 seconds
hbase(main):006:0> list_namespace
NAMESPACE
default
hbase
mydb1
3 row(s) in 0.0120 seconds
hbase(main):007:0>
- 修改namespace
hbase(main):009:0> alter_namespace 'mydb1',{
METHOD=>'set','createtime'=>'2022-4-6','author'=>'wanghaha'}
0 row(s) in 0.6220 seconds
hbase(main):010:0> describe_namespace 'mydb1'
DESCRIPTION
{
NAME => 'mydb1', author => 'wanghaha', createtime => '2022-4-6'}
1 row(s) in 0.0050 seconds
- 修改namespace