Hbase知识点总结

目录

 

一、HBase介绍

1.1基本概念

1.2Hbase组件

1.2.1Hmaster

   1.2.2RegionServer

1.2.3其他组件

二、Hbase数据结构

2.1 Row key

     2.1.1 设计原则

2.2 Columns Family

2.3Time Stamp

三、HBase shell 操作

3.1 基本操作

1) 进入HBase客户端命令行

2) 查看帮助命令

3)查看某个命令的详细使用

4)查看当前数据库中有那些表

5)查看集群状态

6) 查看集群版本

7)当前登录用户角色信息

8)查看对某张表进行操作的基本命令

9)查看表的属性

10)退出命令行

3.2 表的操作

1)创建表

2)插入数据

3)扫描查看表数据

4)查看表结构

5)更新字段信息

6)统计表数据行数

7)删除数据


一、HBase介绍

1.1基本概念

    HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键列键时间戳建立索引,是一个可以随机访问的存储和检索数据的平台。利用 HBASE技术可在廉价 PC Server 上搭建起大规模结构化存储集群。

   HBase不限制存储的数据的种类,允许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase被设计成在一个服务器集群上运行,可以相应地横向扩展。

   HBase是建立在Hadoop文件系统之上的分布式面向列的数据库。它是一个开源项目,是横向扩展的。 HBase本身是一个数据模型,类似于谷歌的大表设计(BIgtable),可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)提供的容错能力。提供对数据的随机实时读/写访问,是Hadoop文件系统的一部分。 人们可以直接或通过HBase存储HDFS数据。使用HBase在HDFS读取消费/随机访问数据。 HBASE 利用的是 Hadoop 的MapReduce 来处理 HBASE 中的海量数据。协同服务方面Google Bigtable 利用 Chubby来支持 ,HBASE 利用Zookeeper 作为对应。

1.2Hbase组件

1.2.1Hmaster

功能:

    1)管理用户对表的增删改查操作

    2)管理HRegionServer的负载均衡,调整Region的分布

    3)在Region Split之后,负责新的Region的分配

    4)在HRegionServer停机之后,负责失效的HRegionServer上的Regions迁移

   1.2.2RegionServer

简介:

    HRegionServer是HBase中最主要的组件,负责table数据的实际读写,管理Region。在分布式集群中,HRegionServer一般跟DataNode在同一个节点上,目的是实现数据的本地性,提高读写效率。

功能:

    1)负责存储 HBase 的实际数据

    2)处理分配给它的 Region

    3)刷新缓存到 HDFS

    4)维护 HLog

    5)执行压缩

    6)负责处理 Region 分片


                              (0.94之后的HRegionServer:图片来自Map-R网站)

                                                     (HBASE架构图)

1.2.3其他组件

1)Write-Ahead logs

HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile 的文件中, 然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

2)HFile

这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。关于HFile详细请看:https://www.cnblogs.com/slgkaifa/p/7137973.html

3)Store

HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。

4)MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL中之后,RegsionServer 会在内存中存储键值对。

5)Region

Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。

二、Hbase数据结构

2.1 Row key

      我们知道,HBase是一个面向列的、分布式的数据库,而且采用的是KeyValue的列存储,那么RowKey就是KeyValue中的对应的Key值,表示唯一一行,是用来检索记录的主键,rowkey本身也是一段二进制码流,最大长度为64KB,内容可以用户自定义。数据加载时,一般也是根据RowKey的二进制由小到大进行的。访问Hbase 表中的行,一般只有三种方式:

  1. 通过单个RowKey访问,通过某个RowKey键值进行get操作,这样可以获取唯一一条数据
  2. 通过RowKey的range(正则)进行扫描。设置startRowKey和endRowKey的值,在此范围内扫描,可以按照指定条件,获取一批数据
  3. 全表扫描,获取整张表的所有行记录。

     2.1.1 设计原则

长度原则

长度原则,顾名思义,rowkey设计的长度是有要符合一定规则的,它最大长度64kb,而在实际应用中,一般只为10-100bytes之间,以byte[]方式存储,一把设计成定长,官方的建议越短越好,尽量不要超过16个字节,为什么会有奇怪要求呢?

  1. 数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
  2. MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。
  3. 目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。

散列原则

把主键哈希后当成rowkey的头部,随机生成rowkey,用于解决热点问题。

唯一原则

rowkey作为主键,必须在设计上保证其唯一性。

2.2 Columns Family

列族:HBASE 表中的每个列,都归属于某个列族。列族是表的 schema 的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math都属于 courses 这个列族。HBase中将一个Column Family中的列存在一起,而不同Column Family的数据则分开。Column Family的数量通常很小,这样我们在访问需要的数据的时候,只读取少量的数据。

2.3Time Stamp

时间戳:HBASE 中通过 rowkey 和 columns 确定的为一个存贮单元称为 cell。每个 cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64 位整型。时间戳可以由 HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE  提供 了两种数据版本回收方式。一是保存数据的最后 n 个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

三、HBase shell 操作

3.1 基本操作

1) 进入HBase客户端命令行

[hadoop@bd-node11 hbase]$ bin/hbase shell

hbase命令行可能出现输错无法Backspace的情况,ctrl+Backspace。https://blog.csdn.net/qq_19968255/article/details/82803729

2) 查看帮助命令

hbase(main):001:0> help

3)查看某个命令的详细使用

hbase(main):002:0>help ' alter'

4)查看当前数据库中有那些表

hbase(main):004:0>list

5)查看集群状态

hbase(main):003:0> status
1 active master, 1 backup masters, 5 servers, 0 dead, 1.4000 average load

6) 查看集群版本

hbase(main):004:0> version
1.2.11, rca53d58f5b7abde0c189c9f78baf4246bddffac3, Fri Feb 15 18:12:16 CST 2019

7)当前登录用户角色信息

hbase(main):006:0> whoami
hadoop (auth:SIMPLE)
     groups: hadoop

8)查看对某张表进行操作的基本命令

hbase(main):007:0> table_help

9)查看表的属性

hbase(main):009:0> desc 'KYLIN_1GHL'

hbase(main):010:0> describe 'KYLIN_1GHL'

# 其中的属性的意义: NAME:列族名 VERSIONS:最大版本号 MIN_VERSIONS:最小版本号 TTL(Time To Live):存活时间 IN_MEMORY:是否开启缓存,默认false,应该开启,否则与BLOCKCACHE冲突 BLOCKCACHE:读缓存是否开启,默认开启,64M 

10)退出命令行

hbase(main):003:0>exit

3.2 表的操作

1)创建表

# create '表名','列族1','列族2'...

hbase(main):001:0> create 'person','info'

0 row(s) in 1.4020 seconds

=> Hbase::Table - person

# 等价于

hbase(main):002:0> create 'person',{NAME=>'info' }

2)插入数据

# put  '表名' ,'rowkey','列族名','列族名:列名','值'

hbase(main):004:0> put 'person','0001','info:name','zhangsan'
0 row(s) in 0.0260 seconds

hbase(main):005:0> put 'person','0001','info:age','21'
0 row(s) in 0.0160 seconds

hbase(main):006:0> put 'person','0002','info:name','lisi'
0 row(s) in 0.0070 seconds

# 也可以指定时间戳,默认为系统当前时间

hbase(main):007:0> put 'person','0002','info:age',23,2922012784770
0 row(s) in 0.0150 seconds

3)扫描查看表数据

#  全表扫描

hbase(main):008:0> scan 'person'
ROW                        COLUMN+CELL                                                            
0001                       column=info:age, timestamp=1555469985562, value=21                    
0001                       column=info:name, timestamp=1555469944902, value=zhangsan             
0002                       column=info:age, timestamp=2922012784770, value=23                    
0002                       column=info:name, timestamp=1555470036626, value=lisi                 
2 row(s) in 0.0310 seconds

#  扫描时指定列族

hbase(main):010:0> scan 'person',{COLUMNS=>'info:name'}
ROW                        COLUMN+CELL                                                           
0001                       column=info:name, timestamp=1555469944902, value=zhangsan             
0002                       column=info:name, timestamp=1555470036626, value=lisi                 
2 row(s) in 0.0580 seconds

#  扫描时指定列族,并显示最近五个版本

hbase(main):013:0> scan 'person',{COLUMNS=>'info:name',VERSION=>5}

#  设置开启Raw模式,开启Raw模式会把那些已添加删除标记但是未实际删除的数据也显示出来

hbase(main):014:0>scan 'person', {COLUMNS => 'info:name', RAW => true}

#  查询student表中列族为id和name的信息

hbase(main):015:0> scan 'student',{ COLUMNS=>['id','name'] }

#  查询student表中列族为id,列名为xx和列族为name的信息

hbase(main):023:0> scan 'student',{COLUMNS=>['id:xx','name:firstname'] }
ROW                      COLUMN+CELL                                                           
1000                     column=id:xx, timestamp=1555481141503, value=120                      
1000                     column=name:firstname, timestamp=1555481466574, value=wangwu          
1 row(s) in 0.0180 seconds

#  查询student表中列族为id和name且列名中包括f字符的信息

hbase(main):025:0> scan 'student',{COLUMNS=>['id','name'],FILTER=>"QualifierFilter(=,'substring:f')"}
ROW                           COLUMN+CELL                                                                       
1000                          column=name:firstname, timestamp=1555481466574, value=wangwu                      
1 row(s) in 0.0620 seconds

4)查看表结构

hbase(main):002:0> desc 'student'

hbase(main):002:0> describe 'student'

5)更新字段信息

 

hbase(main):003:0> put 'person','1001','info:name','Nick' 
hbase(main):004:0> put 'person','1001','info:age','100'

# 增加列族 alter  'table_name','add_family'

hbase(main):006:0> alter 'person','city'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9390 seconds

#  增加列族属性 alter 'table_name' ,{NAME=> 'add_family' VERSIONS=> 3}

#  删除列族 alter 'table_name' , 'delete' => 'delete_family' 或者 alter 'table_name', {NAME => 'delete_family', METHOD => 'delete'}

hbase(main):008:0> alter 'person','delete' => 'city'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9430 seconds

#  添加列族f1 时 同时删除列族f2

hbase(main):011:0> alter 'person',{NAME=>'gender'},{NAME=>'info',METHOD=>'delete'}
Updating all regions with the new schema...
1/1 regions updated.
Done.
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.7640 seconds

6)统计表数据行数

hbase(main):012:0> count 'person'

7)删除数据

#  删除某 rowkey 的全部数据:

hbase(main):014:0> deleteall 'student','0001'

#  删除某 rowkey 的某一列数据:

hbase(main):001:0> scan 'student'
ROW                      COLUMN+CELL                                                           
10010                    column=info:age, timestamp=1555567654618, value=12                    
10010                    column=info:city, timestamp=1555567859735, value=beijing              
10010                    column=info:sex, timestamp=1555567674157, value=nan                   
1 row(s) in 0.3850 seconds

hbase(main):002:0> delete 'student','10010','info:sex'
0 row(s) in 0.0990 seconds

hbase(main):003:0> scan 'student'
ROW                      COLUMN+CELL                                                           
10010                    column=info:age, timestamp=1555567654618, value=12                    
10010                    column=info:city, timestamp=1555567859735, value=beijing              
1 row(s) in 0.0110 seconds

删除表,hbase的某些版本,在删除表之前,需要先禁用表

# 查看表是否禁用
hbase(main):004:0> is_disabled 'student'
false                                                                                          
0 row(s) in 0.0910 seconds
# 启用表
hbase(main):005:0> enable 'student'
# 查看表是否被启用
hbase(main):008:0> is_enabled 'student'
true                                                                                           
0 row(s) in 0.0080 seconds
# 禁用表
hbase(main):009:0> disable 'student'
0 row(s) in 2.3170 seconds
# 删除表
hbase(main):010:0> drop 'student'

# 清空表数据

hbase(main):013:0> truncate 'student'
Truncating 'student' table (it may take a while):
 - Disabling table...
 - Truncating table...
0 row(s) in 3.3610 seconds

 

参考:https://cloud.tencent.com/developer/article/1336648

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值