一文彻底搞懂HBase

Posted 刘元涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文彻底搞懂HBase相关的知识,希望对你有一定的参考价值。

本文是基于CentOS 7.9系统环境,进行HBase的学习和使用

一、HBase的简介

1.1 HBase基本概念

HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库,可以解决HDFS随机写的问题

1.2 HBase数据模型

逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map

  • Name Space

    命名空间,类似于关系型数据库的DatabBase概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间。

  • Region

    类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。

  • Row

    HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。

  • Column

    HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,例如info:name,info:age。建表时,只需指明列族
    ,而列限定符无需预先定义。

  • Time Stamp

    用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间。

  • Cell

    由rowkey, column Family:column Qualifier, time Stamp 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存储

1.3 HBase逻辑结构

这种逻辑结构,采用避免全表扫描的分区策略


1.4 HBase物理存储结构

HBase依赖时间戳进行数据的管理,因此时间戳对于HBase十分重要,一定要确保不同系统之间的时间一致,否则在操作HBase时会出现各种异常错误

1.5 HBase基础架构

  • Region Server

    Region Server为 Region的管理者,其实现类为HRegionServer,主要作用如下:
    对于数据的操作:get, put, delete
    对于Region的操作:splitRegion、compactRegion

  • Master

    Master是所有Region Server的管理者,其实现类为HMaster,主要作用如下:
    对于表的操作:create,delete,alter,select
    对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移

  • Zookeeper

    HBase通过Zookeeper来做Master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作

  • HDFS

    HDFS为HBase提供最终的底层数据存储服务,同时为HBase提供高可用的支持

二、HBase的伪分布式安装

2.1 HBase依赖环境

(1) Hadoop启动

sbin/start-dfs.sh
sbin/start-yarn.sh
sbin/mr-jobhistory-daemon.sh start historyserver

2.2 HBase安装

(1) HBase解压

tar -xzvf hbase-1.3.1-bin.tar.gz -C /opt/module

(2) 配置regionservers

vi /opt/module/hbase/conf/regionservers
# 添加内容如下
192.168.0.109

(3) 配置hbase-env.sh

vi /opt/module/hbase/conf/hbase-env.sh
# 修改内容如下
export JAVA_HOME=/opt/module/jdk1.8.0_201

# 注释内容
# 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"

# 修改内容如下
export HBASE_MANAGES_ZK=true

(4) 配置hbase-site.xml

首先创建一个zkData目录

mkdir -p /opt/module/hbase/data/zkData
<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://192.168.0.109:9000/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.property.dataDir</name>
                 <value>/opt/module/hbase/data/zkData</value>
        </property>
</configuration>

(5) 配置hadoop的软连接到hbase

ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml
ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml

2.3 HBase启动

(1) HBase启动zookeeper

cd /opt/module/hbase/
bin/hbase-daemon.sh start zookeeper

(2) HBase启动master

cd /opt/module/hbase/
bin/hbase-daemon.sh start master

(3) HBase启动regionserver

cd /opt/module/hbase/
bin/hbase-daemon.sh start regionserver

(4) HBase停止regionserver

cd /opt/module/hbase/
bin/hbase-daemon.sh stop regionserver

(5) HBase停止master

cd /opt/module/hbase/
bin/hbase-daemon.sh stop master

(6) HBase停止zookeeper

cd /opt/module/hbase/
bin/hbase-daemon.sh stop zookeeper

(7) HBase集群启动

cd /opt/module/hbase/
bin/start-hbase.sh

(8) HBase集群停止

cd /opt/module/hbase/
bin/stop-hbase.sh

三、HBase的完全分布式安装

3.1 HBase依赖环境

(1) zookeeper启动

#启动所有zookeeper集群节点
cd /opt/module/zookeeper-3.4.10
bin/zkServer.sh start

(2) Hadoop启动

sbin/start-dfs.sh
sbin/start-yarn.sh

3.2 HBase安装

(1) HBase解压

tar -xzvf hbase-1.3.1-bin.tar.gz -C /opt/module

(2) 配置regionservers

vi /opt/module/hbase/conf/regionservers
# 添加内容如下
hadoop101
hadoop102
hadoop103

(3) 配置hbase-env.sh

vi /opt/module/hbase/conf/hbase-env.sh
# 修改内容如下
export JAVA_HOME=/opt/module/jdk1.8.0_201

# 注释内容
# 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"

# 修改内容如下
export HBASE_MANAGES_ZK=false

(4) 配置hbase-site.xml

<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://hadoop101:9000/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>hadoop101,hadoop102,hadoop103</value>
        </property>
        <property>  
                <name>hbase.zookeeper.property.dataDir</name>
                 <value>/opt/module/zookeeper-3.4.10/zkData</value>
        </property>
</configuration>

(5) 配置hadoop的软连接到hbase

ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml
ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml

(6) 配置集群时间同步

安装ntp

yum -y install net-tools
yum -y install ntp

修改配置文件/etc/ntp.conf

vi /etc/ntp.conf
# 限制 192.168.1.0~192.168.255.255之间的服务器可以访问
restrict 192.168.1.0 mask 255.255.0.0 nomodify notrap

# 注释以下内容,因为集群在局域网中,所以不属于互联网其他时间
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

#添加以下信息,当失去互联网连接后,使用本机时间做同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10

修改配置文件/etc/sysconfig/ntpd

vi /etc/sysconfig/ntpd
#添加以下信息,硬件时间与系统时间同步
SYNC_HWCLOCK=yes

hadoop101节点上启动ntp

systemctl stop chronyd
systemctl disable chronyd
systemctl start ntpd
systemctl enable ntpd

其他节点上启动ntp

crontab -e
# 编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop101

3.3 HBase启动

(1) HBase启动master

cd /opt/module/hbase/
bin/hbase-daemon.sh start master

(2) HBase启动regionserver

cd /opt/module/hbase/
bin/hbase-daemon.sh start regionserver

(3) HBase停止regionserver

cd /opt/module/hbase/
bin/hbase-daemon.sh stop regionserver

(4) HBase停止master

cd /opt/module/hbase/
bin/hbase-daemon.sh stop master

(5) HBase集群启动

cd /opt/module/hbase/
bin/start-hbase.sh

(6) HBase集群停止

cd /opt/module/hbase/
bin/stop-hbase.sh

以上是关于一文彻底搞懂HBase的主要内容,如果未能解决你的问题,请参考以下文章

一文彻底搞懂 CMS GC 参数配置

图文详解一文全面彻底搞懂HBaseLevelDBRocksDB等NoSQL背后的存储原理:LSM-tree日志结构合并树...

图文详解一文全面彻底搞懂HBaseLevelDBRocksDB等NoSQL背后的存储原理:LSM-tree日志结构合并树...

图文详解一文全面彻底搞懂HBaseLevelDBRocksDB等NoSQL背后的存储原理:LSM-tree日志结构合并树...

Flink总结之一文彻底搞懂时间和窗口

内含面试|一文搞懂HBase的基本原理