当前位置: 首页 > news >正文

HBase 部署及shell操作

HBase 数据库

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

hadoop1hadoop2hadoop3
NameNode
DataNode
Zookeeper
Hmaster
HRegionServer

3.1.2 软件规划

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

软件版本位数说明
JDK1.864稳定
Zookeeper3.8.4稳定
hadoop2.10.2稳定
HBase2.1.0与Hadoop兼容

3.1.3 用户规划

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

节点用户组用户
hadoop1rootroot
hadoop2rootroot
hadoop3rootroot

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/

上传:
在这里插入图片描述
解压:

[root@hadoop1 local]# tar -zxvf hbase-2.1.0-bin.tar.gz 

创建软连接:

[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配置文件进行个性化配置,修改内容如下所示

[root@hadoop1 hbase]# vim /usr/local/hbase/conf/hbase-site.xml 

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

<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节点角色,修改内容如下:

[root@hadoop1 hbase]# vim /usr/local/hbase/conf/regionservers 

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

hadoop1
hadoop2
hadoop3
3.2.2.3 修改backup-masters配置文件

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

[root@hadoop1 hbase]# vim /usr/local/hbase/conf/backup-masters

添加内容如下:

hadoop2

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

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

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

[root@hadoop1 hbase]# vim /usr/local/hbase/conf/hbase-env.sh 

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

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

3.2.3 配置 HBase 环境变量

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

[root@hadoop1 hbase]# vim /etc/profile

添加如下内容:

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

更新环境变量

[root@hadoop1 hbase]# source /etc/profile
# 添加 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章节),具体操作如下:

[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 集群

[root@hadoop1 tools]# runRemoteCmd.sh "/usr/local/zookeeper/bin/zkServer.sh start" all

在这里插入图片描述

3.3.2 启动 HDFS 集群

[root@hadoop1 tools]# /usr/local/hadoop/sbin/start-dfs.sh

在这里插入图片描述

3.3.3 启动 HBase 集群

[root@hadoop1 tools]# /usr/local/hbase/bin/start-hbase.sh 

日志提示报错:
在这里插入图片描述
上面提示是缺少 htrace.SamplerBuilder类,如下操作再重新启动

[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

[root@hadoop1 hbase]# /usr/local/hbase/bin/hbase shell

在这里插入图片描述

  • 创建 course 表
hbase(main):005:0> create 'course','cf'

在这里插入图片描述

  • 查看 HBase 所有表
hbase(main):006:0> list
  • 查看 course 表结构
hbase(main):008:0> describe 'course'

在这里插入图片描述

  • 向 course 表插入数据
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 表中的所有数据
hbase(main):015:0> scan 'course'

在这里插入图片描述

  • 根据行键查询 course 表
    • 查询整条记录
hbase(main):023:0> get 'course','001'

在这里插入图片描述

- 查询一个列簇数据
hbase(main):025:0> get 'course','001','cf'

在这里插入图片描述
- 查询列簇中其中的一个列

hbase(main):026:0> get 'course','001','cf:cname'

在这里插入图片描述

  • 更新 course 表数据
hbase(main):027:0> put 'course','001','cf:score','99'
hbase(main):028:0> get 'course','001','cf:score'

在这里插入图片描述

  • 查询 course 表总记录
hbase(main):029:0> count 'course'

在这里插入图片描述

  • 删除 course 表数据
    • 删除列簇中的一列
hbase(main):031:0> delete 'course','003','cf:score'
hbase(main):034:0> scan 'course'

在这里插入图片描述
- 删除整行记录

hbase(main):033:0> deleteall 'course','002'
hbase(main):034:0> scan 'course'

在这里插入图片描述

  • 清空 course 表
hbase(main):035:0> truncate 'course'
hbase(main):036:0> scan 'course'

在这里插入图片描述

  • 删除 course 表
hbase(main):037:0> disable 'course'
hbase(main):038:0> drop 'course'

在这里插入图片描述

  • 查看表是否存在
hbase(main):040:0> exists 'course'

在这里插入图片描述

http://www.lryc.cn/news/431099.html

相关文章:

  • 使用Fign进行客户端远程调用和SpringFormEncoder的使用
  • golang 数据库使用注意事项
  • Leetcode面试经典150题-221.最大正方形
  • 51单片机-DS1302,操作简述
  • Vue3+Vite+Echarts 出现Missing semicolon错误
  • iOS——frame和bounds的区别
  • Trm理论 3(注意力机制)
  • Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式
  • 基于STM32的猫狗宠物喂养系统设计(微信小程序)(215)
  • spark读取csv文件
  • 钢铁百科:Q420DR力学性能、Q420DR执行标准、Q420DR低温容器钢板
  • 三菱机器人手柄维修示教器维修手操器面板等
  • 中间件的学习理解总结
  • 编程秘密武器:提升工作效率的关键工具
  • Git+word记笔记
  • java-antrl手敲命令的hello world
  • 法规探讨 | 《医疗器械管理法(草案征求意见稿)》初探(1)
  • 大语言模型的上下文窗口(Context Windows):对人工智能应用的影响
  • Java【数组】
  • xAI巨无霸超级计算机上线:10万张H100 GPU,计划翻倍至20万张
  • python集合
  • 算法打卡 Day29(回溯算法)-复原 IP 地址 + 子集 + 子集 Ⅱ
  • LeetCode 热题100-17 缺失的第一个正数
  • 基于CloudflareSpeedTest项目实现git clone加速
  • 对与单纯post方法写项目的修改成baseservlet方法
  • 北京地铁换乘站人流量监控与图像识别技术优化
  • Day16_0.1基础学习MATLAB学习小技巧总结(16)——元胞数组
  • C#自定义控件的放置与拖动
  • python circular import python循环导入问题
  • kafka集群安装