HBase笔记(日更)

一、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逻辑结构

HBase逻辑结构

  • Row Key:行键,系统自带,在一张表中必须是唯一的,类似MySQL的主键【字典序】
  • 列:类似MySQL的字段
  • 列族:将很多列分出来不同的列族,影响最终的存储,不同的列族存储在不同的文件夹中
  • Region:横向切片
  • store:存储,真正存储在HDFS的数据

其中region/store借鉴MySQL的高表宽表的存储策略

1.2.2 再谈store

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自带两个命名空间分别是hbasedefault,其中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_ZKfalse,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配置一下主机名映射)
Web界面

三、HBase进阶

四、HBase API

五、HBase优化

六、HBase实战之谷粒微博

笔记整理自《尚硅谷大数据技术之HBase》

猜你喜欢

转载自blog.csdn.net/qq_41858402/article/details/106950188