Hbase的基本结构以及常用命令

概述

最近在进行一些数据处理的工作,用到了Hbase进行数据存储,以前也看过一点Hbase,但是在这里进行一些总结,方便以后复习,而且很多命令经常忘记,方便查看

什么是Hbase

HBase(Hadoop Database)是一个开源的、面向列(Column-Oriented),适合存储海量非结构化数
据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系
统。

RDBMS与HBase的对比

3.1、关系型数据库
结构:

* 数据库以表的形式存在
* 支持FAT、NTFS、EXT、文件系统
* 使用Commit log存储日志
* 参考系统是坐标系统
* 使用主键(PK)
* 支持分区
* 使用行、列、单元格

功能:

* 支持向上扩展
* 使用SQL查询
* 面向行,即每一行都是一个连续单元
* 数据总量依赖于服务器配置
* 具有ACID支持
* 适合结构化数据
* 传统关系型数据库一般都是中心化的
* 支持事务
* 支持Join

3.2、HBase
结构:

* 数据库以region的形式存在
* 支持HDFS文件系统
* 使用WAL(Write-Ahead Logs)存储日志
* 参考系统是Zookeeper
* 使用行键(row key)
* 支持分片
* 使用行、列、列族和单元格

功能:

* 支持向外扩展
* 使用API和MapReduce来访问HBase表数据
* 面向列,即每一列都是一个连续的单元
* 数据总量不依赖具体某台机器,而取决于机器数量
* HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)
* 适合结构化数据和非结构化数据
* 一般都是分布式的
* HBase不支持事务
* 不支持Join

Hbase 集群结构

在这里插入图片描述

HBase 系统架构

在这里插入图片描述

  • HBaese Client
Client使用HBase的RPC机制与HMaster、HRegionServer 进行通信。
Client与HMaster进行管理类通信,与HRegion Server进行数据操作类通信。
  • HRegionServer
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应Table中的一个Region。
HRegion由多个Store组成。每个Store对应Table中的一个Column Family的存储,即一个
Store管理一个Region上的一个列族(CF)。每个Store包含一个MemStore和0到多个
StoreFile。Store是HBase的存储核心,由MemStore 和 StoreFile组成。
  • HLog
数据在写入时,首先写入预写日志(Write Ahead Log),每个HRegion Server服务的所有Region
的写操作日志都存储在同一个日志文件中。数据并非直接写入HDFS,而是等缓存到一定数量再批量写
入,写入完成后在日志中做标记。
  • MemStore
MemStore是 一个有序的内存缓存区,用户写入的数据首先放入MemStore,当MemStore满了以后Flush成一个StoreFile
(存储时对应为HFile), 当StoreFile数量增到一定阈值,触发Compact合并,将多个StoreFiles合并成一个StoreFile。
  • StoreFile
StoreFiles 合并后逐步形成越来越大的StoreFile,当Region内所有StoreFiles(Hfile)的总大小超过阈值
(hbase.hregion.max.filesize)即触发分裂Split,把当前的Region Split成2个Region,
父Region下线,新Split出的2个孩子Region被HMaster分配到合适的HRegionServer 上,使得
原先1个Region的压力得以分流到2个Region上。

HBase数据模型

在这里插入图片描述
HBase是由row key,column family,column和cell组成,row key确定唯一的一行,column family由若干column组成,column是表的字段,cell存储了实际的值或数据。

HBase常用操作

  1. 进入HBase客户端命令操作界面
bin/hbase shell
  1. 查看帮助命令
help
  1. 查看当前数据库中有哪些表
hbase(main):002:0> list
  1. 创建一张表
hbase(main):006:0> create 'student','info'
0 row(s) in 4.7590 seconds

=> Hbase::Table - student

  1. 向表中存储一些数据
hbase(main):007:0> put 'student','1001','info:name','Thomas'
0 row(s) in 0.1440 seconds

hbase(main):008:0> put 'student','1001','info:sex','male'
0 row(s) in 0.0150 seconds

hbase(main):009:0> put 'student','1001','info:age','18'
0 row(s) in 0.0130 seconds

hbase(main):014:0> put 'student','1002','info:age','18'
0 row(s) in 0.0140 seconds

hbase(main):015:0> put 'student','1002','info:hobby','read'
0 row(s) in 0.0120 seconds

hbase(main):016:0> put 'student','1002','info:name','jack'
0 row(s) in 0.0060 seconds
  1. 扫描查看存储的数据
hbase(main):017:0> scan 'student'
ROW                                        COLUMN+CELL                                                                                                                
 1001                                      column=info:age, timestamp=1566874407155, value=18                                                                         
 1001                                      column=info:name, timestamp=1566874355716, value=Thomas                                                                    
 1001                                      column=info:sex, timestamp=1566874390231, value=male                                                                       
 1002                                      column=info:age, timestamp=1566874494542, value=18                                                                         
 1002                                      column=info:hobby, timestamp=1566874584481, value=read                                                                     
 1002                                      column=info:name, timestamp=1566874626923, value=jack                                                                      
2 row(s) in 0.0160 seconds

或:查看某个rowkey范围内的数据
hbase(main):018:0> scan 'student',{STARTROW=>'1001',STOPROW=>'1002'}
ROW                                        COLUMN+CELL                                                                                                                
 1001                                      column=info:age, timestamp=1566874407155, value=18                                                                         
 1001                                      column=info:name, timestamp=1566874355716, value=Thomas                                                                    
 1001                                      column=info:sex, timestamp=1566874390231, value=male                                                                       
1 row(s) in 0.0060 seconds

hbase(main):019:0> scan 'student',{STARTROW=>'1001',STOPROW=>'1003'}
ROW                                        COLUMN+CELL                                                                                                                
 1001                                      column=info:age, timestamp=1566874407155, value=18                                                                         
 1001                                      column=info:name, timestamp=1566874355716, value=Thomas                                                                    
 1001                                      column=info:sex, timestamp=1566874390231, value=male                                                                       
 1002                                      column=info:age, timestamp=1566874494542, value=18                                                                         
 1002                                      column=info:hobby, timestamp=1566874584481, value=read                                                                     
 1002                                      column=info:name, timestamp=1566874626923, value=jack                                                                      
2 row(s) in 0.0090 seconds
  1. 查看表结构
hbase(main):021:0> describe 'student'
Table student is ENABLED                                                                                                                                              
student                                                                                                                                                               
COLUMN FAMILIES DESCRIPTION                                                                                                                                           
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESS
ION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}                                                             
1 row(s) in 0.0880 seconds
  1. 更新指定字段的数据
hbase(main):009:0> put 'student','1001','info:name','Nick'

hbase(main):010:0> put 'student','1001','info:age','100'
  1. 查看指定行的数据
hbase(main):022:0> get 'student','1001'
COLUMN                                     CELL                                                                                                                       
 info:age                                  timestamp=1566874407155, value=18                                                                                          
 info:name                                 timestamp=1566874355716, value=Thomas                                                                                      
 info:sex                                  timestamp=1566874390231, value=male                                                                                        
3 row(s) in 0.0210 seconds

或:查看指定行指定列或列族的数据
hbase(main):023:0> get 'student','1001','info:name'
COLUMN                                     CELL                                                                                                                       
 info:name                                 timestamp=1566874355716, value=Thomas                                                                                      
1 row(s) in 0.0080 seconds
  1. 删除数据
hbase(main):024:0> delete 'student','1001','info:sex'
0 row(s) in 0.0390 seconds

hbase(main):025:0> get 'student','1001'
COLUMN                                     CELL                                                                                                                       
 info:age                                  timestamp=1566874407155, value=18                                                                                          
 info:name                                 timestamp=1566874355716, value=Thomas                                                                                      
2 row(s) in 0.0110 seconds

hbase(main):026:0> deleteall 'student','1001'
0 row(s) in 0.0050 seconds

hbase(main):027:0> get 'student','1001'
COLUMN                                     CELL                                                                                                                       
0 row(s) in 0.0040 seconds
=> 1
  1. 清空表数据
hbase(main):029:0> truncate 'student'
Truncating 'student' table (it may take a while):
 - Disabling table...
 - Truncating table...
0 row(s) in 8.1010 seconds
  1. 删除表
hbase(main):031:0> drop 'student'

ERROR: Table student is enabled. Disable it first.

Drop the named table. Table must first be disabled:
  hbase> drop 't1'
  hbase> drop 'ns1:t1'

  
首先需要先让该表为disable状态,使用命令:
  hbase(main):032:0> disable 'student'
0 row(s) in 4.4390 seconds

hbase(main):033:0> drop 'student'
0 row(s) in 2.4320 seconds

然后才能drop这个表,使用命令:
hbase(main):019:0> drop 'student'
(**提示:**如果直接drop表,会报错:Drop the named table. Table must first be disabled)
  1. 统计一张表有多少行数据
hbase(main):028:0> count 'student'
1 row(s) in 0.0470 seconds

HBase读写流程

  1. HBase读数据流程
HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,
从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着。

接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer,从而读取到Meta,
进而获取到Meta表中存放的元数据。

Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer的Memstore和
Storefile来查询数据。

最后HRegionServer把查询到的数据响应给Client。
  1. HBase写数据流程
Client也是先访问zookeeper,找到Meta表,并获取Meta表元数据。

确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。

Client向该HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。

Client先把数据写入到HLog,以防止数据丢失。

然后将数据写入到Memstore。

如果HLog和Memstore均写入成功,则这条数据写入成功

如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中。

当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的Storefile。

当Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。

HBase中的3个重要机制

  1. flush机制
    当MemStore达到阈值,将Memstore中的数据Flush进Storefile
    涉及属性:
    hbase.hregion.memstore.flush.size:134217728
    即:128M就是Memstore的默认阈值

    hbase.regionserver.global.memstore.upperLimit:0.4
    即:这个参数的作用是当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。

    hbase.regionserver.global.memstore.lowerLimit:0.38
    即:当MemStore使用内存总量达到hbase.regionserver.global.memstore.upperLimit指定值时,将会有多个MemStores flush到文件中,MemStore flush 顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于lowerLimit

  2. compact机制
    把小的Memstore文件合并成大的Storefile文件。

  3. split机制
    当Region达到阈值,会把过大的Region一分为二。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase Shell是HBase的交互式命令行界面,用于管理HBase数据库和执行各种操作。以下是HBase Shell常用命令: 1. help:显示可用命令的帮助信息。 2. version:显示当前HBase Shell的版本号。 3. status:显示HBase集群的状态信息,包括RegionServer的数量和状态。 4. list:列出所有的表。 5. create ‘table_name’, ‘column_family’:创建一个新表,并指定列族。 6. disable ‘table_name’:禁用一个表,停止对其进行读写操作。 7. enable ‘table_name’:启用一个表,允许对其进行读写操作。 8. describe ‘table_name’:显示一个表的结构信息,包括列族和列的详细信息。 9. alter ‘table_name’, {NAME => ‘column_family’, VERSIONS => ‘version_count’}:修改表的列族或列的配置,例如修改列族的最大版本数目。 10. drop ‘table_name’:删除一个表。 11. put ‘table_name’, ‘row_key’, ‘column_family:column’, ‘value’:向表中插入一条数据。 12. get ‘table_name’, ‘row_key’:获取表中指定行的数据。 13. scan ‘table_name’:扫描整个表,获取所有数据。 14. delete ‘table_name’, ‘row_key’, ‘column_family:column’:删除表中指定行的数据。 15. count ‘table_name’:统计表中的行数。 这些命令只是HBase Shell中的一部分,还有其他更多的命令可用于管理和操作HBase数据库。通过使用这些命令,可以在HBase Shell中轻松地管理表、插入和检索数据,以及执行其他与HBase相关的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值