HBase 部署及shell操作

HBase 数据库

  • [一、HBase 概述](#一、HBase 概述)
    • [1.1 HBase 是什么](#1.1 HBase 是什么)
    • [HBase 的特点](#HBase 的特点)
  • [二、HBase 模型及架构](#二、HBase 模型及架构)
    • [2.1 HBase 逻辑模型](#2.1 HBase 逻辑模型)
    • [2.2 HBase 数据模型](#2.2 HBase 数据模型)
    • [2.3 HBase 物理模型](#2.3 HBase 物理模型)
      • [2.3.1 列簇物理模型](#2.3.1 列簇物理模型)
      • [2.3.2 Rowkey 字段排序](#2.3.2 Rowkey 字段排序)
      • [2.3.3 Region 存储到不同节点](#2.3.3 Region 存储到不同节点)
      • [2.3.4 Region 结构](#2.3.4 Region 结构)
    • [2.4 HBase 基本架构](#2.4 HBase 基本架构)
  • [三、搭建 HBase 分布式集群](#三、搭建 HBase 分布式集群)
    • [3.1 HBase 集群规划](#3.1 HBase 集群规划)
      • [3.1.1 主机规划](#3.1.1 主机规划)
      • [3.1.2 软件规划](#3.1.2 软件规划)
      • [3.1.3 用户规划](#3.1.3 用户规划)
      • [3.1.4 数据目录规划](#3.1.4 数据目录规划)
    • [3.2 HBase 集群安装配置](#3.2 HBase 集群安装配置)
      • [3.2.1 下载上传解压](#3.2.1 下载上传解压)
      • [3.2.2 修改配置文件](#3.2.2 修改配置文件)
        • [3.2.2.1 修改hbase-site.xml配置文件](#3.2.2.1 修改hbase-site.xml配置文件)
        • [3.2.2.2 修改regionservers配置文件](#3.2.2.2 修改regionservers配置文件)
        • [3.2.2.3 修改backup-masters配置文件](#3.2.2.3 修改backup-masters配置文件)
        • [3.2.2.4 修改hbase-env.sh配置文件](#3.2.2.4 修改hbase-env.sh配置文件)
      • [3.2.3 配置 HBase 环境变量](#3.2.3 配置 HBase 环境变量)
      • [3.2.4 配置文件同步到集群其他节点](#3.2.4 配置文件同步到集群其他节点)
    • [3.3 启动 HBase 集群服务](#3.3 启动 HBase 集群服务)
      • [3.3.1 启动 Zookeeper 集群](#3.3.1 启动 Zookeeper 集群)
      • [3.3.2 启动 HDFS 集群](#3.3.2 启动 HDFS 集群)
      • [3.3.3 启动 HBase 集群](#3.3.3 启动 HBase 集群)
      • [3.3.5 HBase Web 界面](#3.3.5 HBase Web 界面)
  • [四、HBase shell 操作](#四、HBase shell 操作)

一、HBase 概述

1.1 HBase 是什么

HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,利用HBase技术可在廉价的PC Server上搭建大规模结构化存储集群。

HBase是Google BigTable的开源实现,与Google的BigIable利用GFS作为其文件存储系统类似,HBase则利用Hadoop的HDFS作为其文件存储系统。Google运行 MapReduce 来处理Bigtable中的海量数据,而HBase则利用 Hadoop的MapReduce来处理HBase中的海量数据Google Bigtable利用Chubby作为协同服务,而HBase则利用Zookeeper作为协同服务。

HBase 的特点

  • 容量巨大:单表可以有百亿行、数百万列。
  • 无模式:同一个表的不同行可以有截然不同的列。
  • 面向列:HBase是面向列的存储和权限控制,并支持列独立索引。
  • 稀疏性:表可以设计得非常稀疏,值为空的列并不占用存储空间。
  • 扩展性:HBase底层文件存储依赖HDFS,它天生具备可扩展性。
  • 高可靠性:HBase提供了预写日志(WAL)和副本(Replication)机制,防止数据丢失。
  • 高性能:底层的LSM(Log-Structured Merge Tree)数据结构和RowKey有序排列等架构上的独特设计,使得HBase具备非常高的写入性能。

二、HBase 模型及架构

2.1 HBase 逻辑模型

2.2 HBase 数据模型

  • HBase是一种列式存储的分布式数据库,其核心概念是表(Table)。与传统关系型数据库一样,HBase 的表也是由行和列组成,但 Hase同一列可以存储不同时刻的值,同时多个列可以组成一个列簇(Column Family),这种组织形式主要是出于HBase存取性能的考虑。

  • 行键

    Rowkey 既是 HBase 表的行键,也是 HBase 表的主键。HBase 表中的记录是按照RowKey的字典顺序进行存储的。

    在HBase中,为了高效地检索数据,需要设计良好的Rowkey来提高查询性能。因为Rowkey 会被几余存储,所以长度不宜过长,Rowkey 过长将会占用大量的存储空间同时会降低检索效率。其次 Rowkey 应该尽量均匀分布,避免产生热点问题(大量用户访问集中在一个或极少数节点,从而造成单台节点超出自身承受能力)。另外需要保证Rowkey的唯一性。

  • 列簇

    HBase表中的每个列都归属于某个列簇,一个列簇中的所有列成员有着相同的前缀。比如,列anchor:cnnsi.com和anchor:my.look.ca都是列簇anchor的成员。列簇是表的schema的-部分,必须在使用表之前定义列簇,但列却不是必需的,写数据的时候可以动态加入。一般将经常一起查询的列放在一个列簇中,合理划分列簇将减少查询时加载到缓存的数据,提高查询效率,但也不能有太多的列簇,因为跨列簇访问是非常低效的。

  • 单元格

    HBase中通过RowKey和Column确定的一个存储单元称为单元格(Ce11)。每个单元格都保存着同一份数据的多个版本,不同时间版本的数据按照时间顺序倒序排序,最新时间的数据排在最前面,时间截是 64 位的整数,可以由客户端在写入数据时赋值,也可以由RegionServer自动赋值。

2.3 HBase 物理模型

2.3.1 列簇物理模型

2.3.2 Rowkey 字段排序

2.3.3 Region 存储到不同节点

一个表包含不同的Region,一个 Region 包含不同列簇,一个列簇包含不同的列

2.3.4 Region 结构

在 Region 中,数据先写在内存 memStore,然后再保存在磁盘文件(HDFS)中;一个 Store 表示一个列簇

2.4 HBase 基本架构

  • HMaster:管理表的增删改查、负责负载均衡
  • Zookeeper:监听HRegionServer的上下线,HMaster主备切换
  • HRegionServer:负载客户端的读写请求、预写日志、管理 HRegion
  • HRegion:管理 Store,写入内存,写入磁盘文件
  • HFile:内容写入 HDFS

三、搭建 HBase 分布式集群

3.1 HBase 集群规划

HBase底层数据存储在HDFS之上,所以构建HBase集群之前需要确保HDFS集群正常运行。为了确保数据的本地性,HBase集群安装选择跟HDFS集群共享节点。

3.1.1 主机规划

仍然选择hadoop1、hadoop2和hadoop3节点安装部署HBase集群,那么相关角色规划如下:

hadoop1 hadoop2 hadoop3
NameNode
DataNode
Zookeeper
Hmaster
HRegionServer

3.1.2 软件规划

HBase集群的安装需要考虑与Hadoop版本的兼容性问题,否则HBase可能无法正常运行,其相关软件版本如下:

软件 版本 位数 说明
JDK 1.8 64 稳定
Zookeeper 3.8.4 稳定
hadoop 2.10.2 稳定
HBase 2.1.0 与Hadoop兼容

3.1.3 用户规划

HBase集群安装用户保持与Hadoop集群安装用户一致即可,其用户规划如下:

节点 用户组 用户
hadoop1 root root
hadoop2 root root
hadoop3 root root

3.1.4 数据目录规划

在正式安装HBase之前,需要规划好所有的软件目录和数据存放目录,便于后期的管理与维护。HBase目录规划如下:

目录名称 目录路径
HBase 软件安装目录 /usr/local
RegionServer 共享目录 hdfs://mycluster/hbase
Zookeeper 数据目录 /usr/local/data/zookeeper

3.2 HBase 集群安装配置

3.2.1 下载上传解压

下载地址https://archive.apache.org/dist/hbase/

上传:

解压:

javascript 复制代码
[root@hadoop1 local]# tar -zxvf hbase-2.1.0-bin.tar.gz 

创建软连接:

javascript 复制代码
[root@hadoop1 local]# ln -s hbase-2.1.0 hbase

3.2.2 修改配置文件

进入hadoop1节点的conf目录,修改HBase集群相关配置文件

3.2.2.1 修改hbase-site.xml配置文件

通过修改hbase-site.xml配置文件进行个性化配置,修改内容如下所示

javascript 复制代码
[root@hadoop1 hbase]# vim /usr/local/hbase/conf/hbase-site.xml 

添加如下内容(记得把注释去掉,以免不能正常启动):

javascript 复制代码
<configuration>
  <property>
      <name>hbase.zookeeper.quorum</name>
      <value>hadoop1,hadoop2,hadoop3</value>
      <description>指定Zookeeper集群节点</description>
  </property>
  <property>
      <name>hbase.zookeeper.property.dataDir</name>
      <value>/usr/local/zookeeper/data/zkdata</value>
      <description>指定Zookeeper数据存储目录</description>
  </property>
  <property>
      <name>hbase.zookeeper.property.clientPort</name>
      <value>2181</value>
      <description>指定Zookeeper端口号</description>
  </property>
  <property>
      <name>hbase.rootdir</name>
      <value>hdfs://mycluster/hbase</value>
      <description>指定HBase在HDFS上的根目录</description>
  </property>
  <property>
          <name>hbase.cluster.distributed</name>
          <value>true</value>
          <description>指定true为分布式集群部署</description>
  </property>
  <property>
		<name>hbase.unsafe.stream.capability.enforce</name>
		<value>false</value>
		<description>使用本地文件系统设置为false,使用hdfs设置为true</description>
  </property>
</configuration>
3.2.2.2 修改regionservers配置文件

修改regionservers配置文件添加RegionServer节点角色,修改内容如下:

javascript 复制代码
[root@hadoop1 hbase]# vim /usr/local/hbase/conf/regionservers 

添加如下内容(不要添加空格或最后加换行):

javascript 复制代码
hadoop1
hadoop2
hadoop3
3.2.2.3 修改backup-masters配置文件

修改backup-masters配置文件(可能不存在此文件)添加备用节点,修改内容如下:

javascript 复制代码
[root@hadoop1 hbase]# vim /usr/local/hbase/conf/backup-masters

添加内容如下:

javascript 复制代码
hadoop2

因为HBase的HMaster角色需要配置高可用,所以这里选择hadoop2为备用节点。

3.2.2.4 修改hbase-env.sh配置文件

修改hbase-env.sh配置文件添加相关环境变量,修改内容如下:

javascript 复制代码
[root@hadoop1 hbase]# vim /usr/local/hbase/conf/hbase-env.sh 

修改如下内容(注释部分记得去掉):

javascript 复制代码
# 配置jdk安装路径
export JAVA_HOME=/usr/local/jdk
# 使用独立的Zookeeper集群
export HBASE_MANAGES_ZK=false

3.2.3 配置 HBase 环境变量

添加HBase环境变量,添加内容如下

javascript 复制代码
[root@hadoop1 hbase]# vim /etc/profile

添加如下内容:

javascript 复制代码
# 添加 HBase 环境变量
HBASE_HOME=/usr/local/hbase
PATH=$HBASE_HOME/bin:$PATH
export HIVE_HOME PATH

更新环境变量

javascript 复制代码
[root@hadoop1 hbase]# source /etc/profile
javascript 复制代码
# 添加 HBase 环境变量
HBASE_HOME=/usr/local/hbase
PATH=$HBASE_HOME/bin:$PATH
export HIVE_HOME PATH

3.2.4 配置文件同步到集群其他节点

将hadoop1节点中配置好的HBase安装目录,分发给hadoop2和hadoop3节点,因为HBase集群配置都是一样的。这里使用工具 deploy.shrunRemoteCmd.sh 命令进行分发(ZooKeeper 集群的详细部署的4.1章节),具体操作如下:

javascript 复制代码
[root@hadoop1 tools]# deploy.sh /usr/local/hbase-2.1.0 /usr/local/ slave
[root@hadoop1 tools]# deploy.sh /etc/profile /etc slave
[root@hadoop1 tools]# runRemoteCmd.sh "ln -s /usr/local/hbase-2.1.0 /usr/local/hbase" slave

3.3 启动 HBase 集群服务

3.3.1 启动 Zookeeper 集群

javascript 复制代码
[root@hadoop1 tools]# runRemoteCmd.sh "/usr/local/zookeeper/bin/zkServer.sh start" all

3.3.2 启动 HDFS 集群

javascript 复制代码
[root@hadoop1 tools]# /usr/local/hadoop/sbin/start-dfs.sh

3.3.3 启动 HBase 集群

javascript 复制代码
[root@hadoop1 tools]# /usr/local/hbase/bin/start-hbase.sh 

日志提示报错:

上面提示是缺少 htrace.SamplerBuilder类,如下操作再重新启动

javascript 复制代码
[root@hadoop1 client-facing-thirdparty]# cp /usr/local/hbase/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar /usr/local/hbase/lib/

3.3.5 HBase Web 界面

四、HBase shell 操作

进入 HBbase shell

javascript 复制代码
[root@hadoop1 hbase]# /usr/local/hbase/bin/hbase shell
  • 创建 course 表
javascript 复制代码
hbase(main):005:0> create 'course','cf'
  • 查看 HBase 所有表
javascript 复制代码
hbase(main):006:0> list
  • 查看 course 表结构
javascript 复制代码
hbase(main):008:0> describe 'course'
  • 向 course 表插入数据
javascript 复制代码
put 'course','001','cf:cname','hbase'
put 'course','001','cf:score','95'
put 'course','002','cf:cname','sqoop'
put 'course','002','cf:score','85'
put 'course','003','cf:cname','flume'
put 'course','003','cf:score','98'
  • 查询 course 表中的所有数据
javascript 复制代码
hbase(main):015:0> scan 'course'
  • 根据行键查询 course 表
    • 查询整条记录
javascript 复制代码
hbase(main):023:0> get 'course','001'
- 查询一个列簇数据
javascript 复制代码
hbase(main):025:0> get 'course','001','cf'
  • 查询列簇中其中的一个列
javascript 复制代码
hbase(main):026:0> get 'course','001','cf:cname'
  • 更新 course 表数据
javascript 复制代码
hbase(main):027:0> put 'course','001','cf:score','99'
hbase(main):028:0> get 'course','001','cf:score'
  • 查询 course 表总记录
javascript 复制代码
hbase(main):029:0> count 'course'
  • 删除 course 表数据
    • 删除列簇中的一列
javascript 复制代码
hbase(main):031:0> delete 'course','003','cf:score'
hbase(main):034:0> scan 'course'
  • 删除整行记录
javascript 复制代码
hbase(main):033:0> deleteall 'course','002'
hbase(main):034:0> scan 'course'
  • 清空 course 表
javascript 复制代码
hbase(main):035:0> truncate 'course'
hbase(main):036:0> scan 'course'
  • 删除 course 表
javascript 复制代码
hbase(main):037:0> disable 'course'
hbase(main):038:0> drop 'course'
  • 查看表是否存在
javascript 复制代码
hbase(main):040:0> exists 'course'
相关推荐
高兴就好(石3 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆3 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0663 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下3 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss5 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk5 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK5 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D5 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
Flerken1015 小时前
数据库语言、SQL语言、数据库系统提供的两种语言
数据库·sql·oracle
掘根5 小时前
【网络】高级IO——poll版本TCP服务器
网络·数据库·sql·网络协议·tcp/ip·mysql·网络安全