一、HBase简介
1.1HBase定义
HBase是一种分布式、可拓展、支持海量数据存储的非关系型数据库。来源于谷歌的三驾马车之一的BigTable,负责海量数据的存储。对于数据量不大的时候优势不明显,使用HBase不划算,在运行期间一直在“分分合合”的操作耗费资源,当数据量上来时,可以做到几十亿条数据秒级响应。针对HDFS并不支持随机写操作,但HBase是基于HDFS可以在HDFS上实现随机写操作,实现HDFS上的增删改查,其实现十分简单HBase把数据下载下来修改然后重新上传,但由于HBase拥有许多组件对其进行极致的优化,使之让这种效率低的方法速度变得极快,利用资源换取了时间,目前是Apache维护的顶级项目。
1.2 HBase 数据模型
逻辑上,HBase的数据模型关系数据库同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K - V)来看,HBase更像是一个multi-dimensional map
1.2.1 HBase逻辑结构
- Row Key:行键,系统自带,在一张表中必须是唯一的,类似MySQL的主键【字典序】
- 列:类似MySQL的字段
- 列族:将很多列分出来不同的列族,影响最终的存储,不同的列族存储在不同的文件夹中
- Region:横向切片
- store:存储,真正存储在HDFS的数据
其中region/store借鉴MySQL的高表宽表的存储策略
1.2.2 再谈store
在HBsae上每一条数据都有很多信息,如row_key1这列真正存储了行键、列族、列名、时间戳、操作类型和数据,其中HBase实现HDFS的随机写操作完全靠这个时间戳来完成即TimeStamp(记录当前操作时间),**因此后面进行API操作时一定要将Linux时间和Windows时间调成一致,否则会发生各种诡异的事情,如:删除数据删不掉,插入数据看不见等等…**注意到t3和t4时间戳行,发现它们的列名都是phone且操作类型都是Put,这就是HBase的随机写操作(修改phone数据操作),只要t4>t3即可实现修改(覆盖),若进行删除HBase会将操作类型设为Delete,若Delete的时间戳大于Put的时间戳则不返回数据,造成了一种删除的错觉,其实当时的数据并没有被删除(在分表和表过程中删除),否则HBase的速度不会这么快。
1.2.3 数据模型
1)Name Space
命名空间,类似MySQL库的概念,每个命名空间下有很多表,其中HBase自带两个命名空间分别是hbase
和default
,其中hbase
存放系统内置的表,default
是用户默认使用的命名空间。
2)Region
表的切片,当达到高表时会有很多切片对于HBase来说10G一切,当然我们也可以手动切。HBase建表时只需要指定到列族即可,字段可以动态增加,因为HBase是以键值对的形式为一个数据进行存储,他的列(字段)相当于数据里的键。
3)Row
每行数据都有一个RowKey和多个列组成,数据是按照RowKey的字典顺序存储,并且查询数据时只能根据RowKey进行检索。
4)Column
每个列都是由列族和列限定符(字段)进行鉴定
5)TimeStamp
用于标识数据的不同版本,如果不指定时间戳系统会自动天剑当前时间
6)Cell
唯一确定的单元{rowkey,column Family:column Qualifier,time Stamp}。cell中的数据没有类型,底层都是字节数组形式存储。
总结:第一个NameSpace命名空间,类似数据库;第二个Region和表有关系,从大的结构往小看的,起初数据量小的时候,这个表就是一个Region;表里面在HBase叫列族,列族下是列,列下面是数据,但这个数据是你看到的版本最大的数据,实际上这个单元格底下可能隐藏着其它数据,只有row key加列族加列加时间戳才能唯一确定这个数据,不加时间戳可能会是一系列数据,如果我们能唯一确定一个数据即加了时间戳那么这个数据就是一个Cell,叫单元格或者细胞,在这个Cell里数据没有复杂的数据类型都是字节数组。
1.3 HBase基本框架
1)Region Server【DML】
Region的管理者,管理数据的增删改查,和Region的分表(splitRegion)和表(compactRegion)
2)Master【DDL】
RegionServer的管理者,管理表的增删改查,监控每个RegionServer的状态,负载均衡和故障转移
3)Zookeeper
通过Zookeeper实现Master的高可用,RegionServer的监控、元数据入口以及集群的配置维护等
4)HDFS
为HBase提供最终的底层数据存储服务,提供HBase的高可用
二、HBase快速入门
2.1 HBase集群搭建
2.1.1 Zookeeper正常部署并启动
HBase的Master需要Zookeeper提供高可用的支持,通过群起脚本快速启动
#!/bin/bash
pcount=$#
if [ $pcount == 0 ]
then
echo "no args"
exit
fi
# 获取参数
p1=$1
if [ $p1 == "start" ]
then
for i in root@master root@slave01 root@slave02
do
echo "=============== $i ==============="
ssh $i "source /etc/profile && /usr/local/soft/zookeeper-3.4.10/bin/zkServer.sh start"
done
exit
fi
if [ $p1 == "stop" ]
then
for i in root@master root@slave01 root@slave02
do
echo "=============== $i ==============="
ssh $i '/usr/local/soft/zookeeper-3.4.10/bin/zkServer.sh stop'
done
exit
fi
if [ $p1 == "status" ]
then
for i in root@master root@slave01 root@slave02
do
echo "=============== $i ==============="
ssh $i "source /etc/profile && /usr/local/soft/zookeeper-3.4.10/bin/zkServer.sh status"
done
exit
fi
2.1.2 Hadoop正常部署并启动
HBase需要HDFS提供存储服务,通过配置slaves文件可实现群起Hadoop集群(启动hdfs即可)
start-dfs.sh
2.1.3 HBase正常部署并启动
1. HBase解压
tar -zxvf hbase-2.2.5-bin.tar.gz
2. 修改配置文件
cd hbase-2.2.5/conf/
修改hbase-env.sh
# The java implementation to use. Java 1.8+ required.
export JAVA_HOME=/usr/local/soft/jdk1.8.0_144
# Tell HBase whether it should manage it's own instance of ZooKeeper or not.
export HBASE_MANAGES_ZK=false
写死JAVA_HOME
,最新版[2020/6/25]的HBase要求jdk1.8+了,最后一定要修改你HBASE_MANAGES_ZK
为false
,HBase内置了一个Zookeeper默认使用它内置的版本,但会修改你本机的Zookeeper的myid导致原先的Zookeeper集群下次无法正常使用。
修改hbase-site.xml
,内容如下
<configuration>
<!--
The following properties are set for running HBase as a single process on a
developer workstation. With this configuration, HBase is running in
"stand-alone" mode and without a distributed file system. In this mode, and
without further configuration, HBase and ZooKeeper data are stored on the
local filesystem, in a path under the value configured for `hbase.tmp.dir`.
This value is overridden from its default value of `/tmp` because many
systems clean `/tmp` on a regular basis. Instead, it points to a path within
this HBase installation directory.
Running against the `LocalFileSystem`, as opposed to a distributed
filesystem, runs the risk of data integrity issues and data loss. Normally
HBase will refuse to run in such an environment. Setting
`hbase.unsafe.stream.capability.enforce` to `false` overrides this behavior,
permitting operation. This configuration is for the developer workstation
only and __should not be used in production!__
See also https://hbase.apache.org/book.html#standalone_dist
-->
<!-- 是否搭建分布式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 临时文件目录 -->
<property>
<name>hbase.tmp.dir</name>
<value>/usr/local/soft/hbase-2.2.5/tmp/</value>
</property>
<!-- 暂时不知道干嘛的,上面的注释说让你设置成false-->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<!-- 写的是hdfs的namenode节点,相当于将HBase存储到hdfs下的/HBase -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/HBase</value>
</property>
<!-- 默认端口号,可写可不写 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<!-- 你的Zookeeper节点 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave01,slave02</value>
</property>
<!-- 你的Zookeeper工作目录,配置文件里的 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/soft/zookeeper-3.4.10/zkData</value>
</property>
</configuration>
配置regionservers
master
slave01
slave02
注意不要写空格,和群起hdfs一样的要求
软连接hadoop配置文件到hbase
ln -s /usr/local/soft/hadoop-2.7.2/etc/hadoop/core-site.xml /usr/local/soft/hbase-2.2.5/conf/core-site.xml
ln -s /usr/local/soft/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /usr/local/soft/hbase-2.2.5/conf/hdfs-site.xml
最后一步同步分发到其他节点,下面是我的分发脚本xsync.sh
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if [ $pcount == 0 ]
then
echo no args
exit
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
rsync -rvl $pdir/$fname $user@slave01:$pdir
rsync -rvl $pdir/$fname $user@slave02:$pdir
执行分发
xsync.sh /usr/local/soft/hbase-2.2.5/
上面说过在HBase中时间戳很重要,是一切操作的基础,因此集群之间的时间必须通过,默认时间差30秒,因此在集群启动之间必须同步时间,否则无法启动报ClockOutOfSyncException异常如何同步集群时间,不推荐修改默认时间差
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from master</description>
</property>
3. 启动HBase
start-hbase.sh //启动HBase
stop-hbase.sh //关闭HBase
2.1.4 查看集群状态
1. 方式一 jps
为了方便查看各个集群的java进程,我编写一个简单的脚本call.sh
#!/bin/bash
pcount=$#
if [ $pcount == 0 ]
then
echo "no args"
exit
fi
args=$1
if [ $args == "jps" ]
then
for i in master slave01 slave02
do
echo "================ $i ================"
ssh $i /usr/local/soft/jdk1.8.0_144/bin/jps
done
fi
[root@master shell]# call.sh jps
================ master ================
11521 DataNode
11254 QuorumPeerMain
12070 HRegionServer
11928 HMaster
12285 Jps
11407 NameNode
================ slave01 ================
8018 DataNode
7943 QuorumPeerMain
8107 SecondaryNameNode
8236 HRegionServer
8351 Jps
================ slave02 ================
6344 QuorumPeerMain
6665 Jps
6540 HRegionServer
6413 DataNode
1. 方式二 web查看
端口号 master:16010,master是你的HBase的Master节点ip(可在windows配置一下主机名映射)
三、HBase进阶
四、HBase API
五、HBase优化
六、HBase实战之谷粒微博
笔记整理自《尚硅谷大数据技术之HBase》