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.sh 和 runRemoteCmd.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'