hbase 简介、HBASE重要概念、表Table、命名空间、Row Key,区域Region、列族、hbase shell命令行方式操作,命名空间操作

2021年12月15日 164点热度 0条评论

hbase 简介、HBASE重要概念、表Table、命名空间、Row Key,区域Region、列族、hbase shell命令行方式操作,命名空间操作

1 简介

HBase的名字的来源于Hadoop database,即hadoop数据库,不同于一般的关系数据库,它是非结构化数据存储的数据库,而且它是基于列的而不是基于行的模式。

HBase是一个分布式的、面向列的、基于Google Bigtable的开源实现。
利用Hadoop HDFS作为其文件存储系统,
利用Hadoop MapReduce来处理HBase中的海量数据,
利用Zookeeper作为协同服务。

2 HBase重要概念

HBase以表的形式存储数据。表是由行和列组成。列划分为若干个列族/列簇(column family),每个列族/列簇下面可以有多个普通列。
%title插图%num

2.1 表Table

HBase是用表来存储数据的。

2.2 命名空间namespace

namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database,方便对表在业务上划分。
HBASE系统默认定义了两个缺省的namespace:

  • hbase:系统内建表,包含namespace和meta表
  • default:用户建表时未指定namespace的表都创建在此

2.3 Row key

行键,每一行的主键列,每行的行键要唯一,行键的值为任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在HBase内部,rowKey保存为字节数组byte[]
行的一次读写是原子操作 (不论一次读写多少列)

2.4 区域Region

Table在行的方向上分割为多个Region。

Region是按大小分割的,每个表开始只有一个region,随着数据的增多,region不断增大,当增大到一个阀值的时候,region就会等分为两个新的region,之后会有越来越多的region。

Region是HBase中分布式存储和负载均衡的最小单元。不同的Region分布到不同的RegionServer上。

Region由一个或者多个Store组成, 每个Store保存一个column family, 每个Store又由一个MemStore(存储在内存中)和0到多个StoreFile(存储在HDFS上)组成。
%title插图%num

2.5 列族 column family

列族是每个子列的父级,每个子列都属于一个列族,一个列族包含一个或者多个相关列,创建表的时候需要指定列族,而列不需要必须指定。通过“列族名:列名”来表示某个具体的子列。

HBase中的Schema就是 TableName + Column Family Name

2.6 限定符

就是列族下的每个子列名称,或者称为相关列,或者称为限定符,只是翻译不同。
通过columnFamily:column来定位某个子列。

2.7 存储单元cell

我们外观看到的每个单元格其实都对应着多个存储单元,默认情况下一个单元格对应着一个存储单元,一个存储单元可以存储一份数据,如果一个单元格有多个存储单元就表示一个单元格可以存储多个值。可以通过version来设置存储单元个数。可以通过
rowKey + columnFamily + column + timestamp来唯一确定一个存储单元。cell中的数据是没有类型的,全部是字节码形式存贮。

hbase按照时间戳降序排列各时间版本,其他映射建按照升序排序。

2.8 时间戳版本号 timestamp

每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

3 HBase Shell

命名 描述 语法
help ‘命令名’ 查看命令的使用描述 help ‘命令名’
whoami 我是谁 whoami
version 返回hbase集群的状态信息 version
status 返回hbase集群的状态信息 status
table_help 查看如何操作表 status
create 创建表 create ‘表名’, ‘列族名1’, ‘列族名2’, ‘列族名N’
alter 修改列族 添加一个列族:alter ‘表名’, ‘列族名’ / 删除列族:alter ‘表名’, {NAME=> ‘列族名’, METHOD=> ‘delete’}
describe 显示表相关的详细信息 describe ‘表名’
list 列出hbase中存在的所有表 list
exists 测试表是否存在 exists ‘表名’
put 添加或修改的表的值 put ‘表名’, ‘行键’, ‘列族名’, ‘列值’ / put ‘表名’, ‘行键’, ‘列族名:列名’, ‘列值’
scan 通过对表的扫描来获取对用的值 scan ‘表名’ / 扫描某个列族: scan ‘表名’, {COLUMN=>‘列族名’} / 扫描某个列族的某个列: scan ‘表名’, {COLUMN=>‘列族名:列名’} / 查询同一个列族的多个列: scan ‘表名’, {COLUMNS => [ ‘列族名1:列名1’, ‘列族名1:列名2’, …]}
get 获取行或单元(cell)的值 get ‘表名’, ‘行键’ / get ‘表名’, ‘行键’, ‘列族名’
count 统计表中行的数量 count ‘表名’
incr 增加指定表行或列的值 incr ‘表名’, ‘行键’, ‘列族:列名’, 步长值
get_counter 获取计数器 get_counter ‘表名’, ‘行键’, ‘列族:列名’
delete 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值)) 删除列族的某个列: delete ‘表名’, ‘行键’, ‘列族名:列名’
deleteall 删除指定行的所有元素值 deleteall ‘表名’, ‘行键’
truncate 重新创建指定表 truncate ‘表名’
enable 使表有效 enable ‘表名’
is_enabled 是否启用 is_enabled ‘表名’
disable 使表无效 disable ‘表名’
is_enabled 是否启用 is_enabled ‘表名’
is_disabled 是否无效 is_disabled ‘表名’
drop 删除表 drop的表必须是disable的 / disable ‘表名’ / drop ‘表名’
shutdown 关闭hbase集群(与exit不同)
tools 列出hbase所支持的工具
exit 退出

3.1 进入hbase命令行

cd  /home/tuzq/software/hbase-1.3.1/bin
./hbase shell

%title插图%num

3.2 help查看帮助

%title插图%num

3.3 status返回hbase集群的状态信息

显示集群状态status,可以为 ‘summary’, ‘simple’, ‘detailed’, or ‘replication’. 默认为 ‘summary’

hbase(main):006:0> status
1 active master, 0 backup masters, 2 servers, 0 dead, 31.0000 average load
hbase(main):011:0> status 'simaple'
1 active master, 0 backup masters, 2 servers, 0 dead, 31.0000 average load
Took 0.0478 seconds                                                                                                                        
hbase(main):012:0> status 'summary'
1 active master, 0 backup masters, 2 servers, 0 dead, 31.0000 average load
Took 0.0396 seconds                                                                                                                        
hbase(main):013:0> status 'replication'
version 2.0.2.3.1.4.0-315
2 live servers
    hadoop4:
       SOURCE:
       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:44 CST 2020
    hadoop5:
       SOURCE:
       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:43 CST 2020
Took 0.0349 seconds                                                                                                                        
=> #
hbase(main):014:0> status 'replication', 'source'
version 2.0.2.3.1.4.0-315
2 live servers
    hadoop4:
       SOURCE:
    hadoop5:
       SOURCE:
Took 0.0575 seconds                                                                                                                        
=> #
hbase(main):015:0> status 'replication','sink'
version 2.0.2.3.1.4.0-315
2 live servers
    hadoop4:
       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:44 CST 2020
    hadoop5:
       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:43 CST 2020
Took 0.0504 seconds                                                                                                                        
=> #
hbase(main):016:0>

3.4 list显示hbase中的表

list(列出你有哪些表)
%title插图%num

3.5 disable,drop删除user

disable ‘user’
drop ‘user’

3.6 flush清空数据

flush ‘user’

3.7 create创建user表,包含info、data两个列族

create 'user', 'info', 'data'
create 'user', {NAME => 'info', VERSIONS => '3'}

%title插图%num
%title插图%num

3.8 describe显示表相关的详情信息

hbase(main):003:0> describe 'user'
Table user is ENABLED                                                                                                                      
user                                                                                                                                       
COLUMN FAMILIES DESCRIPTION                                                                                                                
{NAME => 'data', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_
DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'R
OW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSI
ON => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}                                                                                  
{NAME => 'info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_
DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'R
OW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSI
ON => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}                                                                                  
2 row(s)
Took 0.2026 seconds                                                                                                                        
hbase(main):004:0>

3.9 put向hbase表中插入信息

向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan

put 'user', 'rk0001', 'info:name', 'zhangsan'

%title插图%num
向user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为female

put 'user', 'rk0001', 'info:gender', 'male'

向user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20

put 'user', 'rk0001', 'info:age', 20
put 'user', 'rk0001', 'info:baby', 'anaglababy'

向user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为picture

put 'user', 'rk0002', 'data:pic', 'picture'

%title插图%num

3.10 get 获取user表中row key为rk0001的所有信息

get 'namespaceName:tableName','rowKey','列族:列'

get 'user', 'rk0001' (一次拿一行)

%title插图%num

获取user表中row key为rk0001,info列族的所有信息

get 'user', 'rk0001', 'info'

%title插图%num

获取user表中row key为rk0001,info列族的name、age列标示符的信息

get 'user', 'rk0001', 'info:name', 'info:age'

%title插图%num

获取user表中row key为rk0001,info、data列族的信息

get 'user', 'rk0001', 'info', 'data'
get 'user', 'rk0001', {COLUMN => ['info', 'data']}

%title插图%num
%title插图%num

get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}

%title插图%num
获取user表中row key为rk0001,列族为info,版本号最新5个的信息

get 'user', 'rk0001', {COLUMN => 'info', VERSIONS => 2}

%title插图%num

get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}

%title插图%num

get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5, TIMERANGE => [1488892553804, 1488892688096]}

%title插图%num
获取user表中row key为rk0001,cell的值为zhangsan的信息

get 'people', 'rk0001', {FILTER => "ValueFilter(=, 'binary:图片')"}

获取user表中row key为rk0001,列标示符中含有a的信息

get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

%title插图%num

put 'user', 'rk0002', 'info:name', 'fanbingbing'
put 'user', 'rk0002', 'info:gender', 'female'
put 'user', 'rk0002', 'info:nationality', '中国'
get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}

%title插图%num

3.11 scan 查询user表中的所有信息

带有条数的scan

scan 'user', {LIMIT=>5}
scan 'namespaceName:tableName',{TIMERANGE => [1594201571000, 1594287971000]}
scan 'user'

%title插图%num
查询user表中列族为info的信息

scan 'user', {COLUMNS => 'info'}

%title插图%num

scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}

%title插图%num

scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

%title插图%num

查询user表中列族为info和data的信息

scan 'user', {COLUMNS => ['info', 'data']}

%title插图%num

scan 'user', {COLUMNS => ['info:name', 'data:pic']}

%title插图%num

查询user表中列族为info、列标示符为name的信息

scan 'user', {COLUMNS => 'info:name'}

%title插图%num
查询user表中列族为info、列标示符为name的信息,并且版本最新的5个

scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

%title插图%num
查询user表中列族为info和data且列标示符中含有a字符的信息

scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

%title插图%num

查询user表中列族为info,rk范围是[rk0001, rk0003)的数据

scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

%title插图%num

查询user表中row key以rk字符开头的

scan 'user',{FILTER=>"PrefixFilter('rk')"}

%title插图%num

查询user表中指定范围的数据

scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

3.12 delete删除数据

删除user表row key为rk0001,列标示符为info:name的数据

delete 'user', 'rk0001', 'info:name'

%title插图%num

删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据

delete 'user', 'rk0001', 'info:name', 1392383705316

3.13 truncate 清空user表中的数据

truncate 'user'

3.14 alter 修改表结构

3.14.1 disable 首先停用user表

disable 'user'

停用之后的表示无法操作的

添加两个列族f1和f2

alter 'people', NAME => 'f1'
alter 'user', NAME => 'f2'

3.15 enable 启用表

enable 'user'

测试:

hbase(main):009:0> put 'user','rk0001','f1:name','zhangsan'
0 row(s) in 0.0460 seconds

hbase(main):010:0> scan 'user'
ROW                                                 COLUMN+CELL                                                                                                                                         
 rk0001                                             column=data:pic, timestamp=1529293065769, value=picture                                                                                             
 rk0001                                             column=f1:name, timestamp=1529297704531, value=zhangsan                                                                                             
 rk0001                                             column=info:age, timestamp=1529292703053, value=20                                                                                                  
 rk0001                                             column=info:gender, timestamp=1529292652194, value=male                                                                                             
 rk0002                                             column=data:pic, timestamp=1529292913569, value=picture                                                                                             
 rk0002                                             column=info:gender, timestamp=1529295488032, value=female                                                                                           
 rk0002                                             column=info:name, timestamp=1529295421434, value=fanbingbing                                                                                        
 rk0002                                             column=info:nationality, timestamp=1529295956024, value=xE4xB8xADxE5x9BxBD                                                                    
2 row(s) in 0.0120 seconds

其中disable ‘user’
删除一个列族:

alter 'user', NAME => 'f1', METHOD => 'delete' 或 alter 'user', 'delete' => 'f1'

案例:

hbase(main):001:0> alter 'user',NAME => 'f1',METHOD => 'delete'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.0000 seconds

hbase(main):003:0> scan 'user'
ROW                                                 COLUMN+CELL                                                                                                                                         
 rk0001                                             column=data:pic, timestamp=1529293065769, value=picture                                                                                             
 rk0001                                             column=info:age, timestamp=1529292703053, value=20                                                                                                  
 rk0001                                             column=info:gender, timestamp=1529292652194, value=male                                                                                             
 rk0002                                             column=data:pic, timestamp=1529292913569, value=picture                                                                                             
 rk0002                                             column=info:gender, timestamp=1529295488032, value=female                                                                                           
 rk0002                                             column=info:name, timestamp=1529295421434, value=fanbingbing                                                                                        
 rk0002                                             column=info:nationality, timestamp=1529295956024, value=xE4xB8xADxE5x9BxBD                                                                    
2 row(s) in 0.0510 seconds

hbase(main):004:0>

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

alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

将user表的f1列族版本号改为5

alter 'people', NAME => 'info', VERSIONS => 5

启用表

enable 'user'

删除表

disable 'user'
drop 'user'

get 'person', 'rk0001', {FILTER => "ValueFilter(=, 'binary:中国')"}
get 'person', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
scan 'person', {COLUMNS => 'info:name'}
scan 'person', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
scan 'person', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

scan 'person', {COLUMNS => 'info', STARTROW => '20140201', ENDROW => '20140301'}
scan 'person', {COLUMNS => 'info:name', TIMERANGE => [1395978233636, 1395987769587]}
delete 'person', 'rk0001', 'info:name'

alter 'person', NAME => 'ffff'
alter 'person', NAME => 'info', VERSIONS => 10


get 'user', 'rk0002', {COLUMN => ['info:name', 'data:pic']}

exists测试表是否存在

exit 退出Hbaseshell

3.16 统计表的条数

方式一:

hbase(main):005:0> count 'test1:fathers_info'   (不建议)

方式二:

[root@hadoop6 ~]# hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'namespaceName:tableName'

%title插图%num

常用操作之namespace

1 介绍

在HBase中,namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database,方便对表在业务上进行划分。HBase全局管理员可以创建、修改和回收namespace的授权。

namespace特性是对表资源进行隔离的一种技术,隔离技术决定了HBase能否实现资源统一化管理的关键,提高了整体的安全性。

## 2 命名空间namespace

HBase系统默认定义了两个缺省的namespace

hbase:系统内建表,包括namespace和meta表都在此

default:用户建表时未指定namespace的表都创建在此

-- 创建namespace
hbase>create_namespace 'nml_ljx'
-- 列出所有namespace
hbase>list_namespace
-- 查看namespace
hbase>describe_namespace 'nml_ljx'
-- 删除namespace
hbase>drop_namespace 'nml_ljx'
-- 在namespace下创建表
hbase>create 'nml_ljx:testtable', 'cf1'
-- 查看namespace下的表
hbase>list_namespace_tables 'nml_ljx'

3 授权

  • Create权限的namespace Admin可以对表创建和删除、生成和恢复快照
  • Admin权限的namespace Admin可以对表splits或major compactions
-- 当前用户:hbase
hbase>namespace_create 'hbase_ns'
-- 授权用户apple对hbase_ns写权限
hbase>grant 'apple', 'W', '@hbase_ns'
-- 回收用户apple对hbase_ns所有权限
hbase>revoke 'apple', '@hbase_ns'

-- 当前用户:apple
hbase>create 'hbase_ns.table1', 'cfamily1'
hbase>create 'hbase_ns.table2', 'cfamily1'

-- 用户apple创建了两张表table1和table2,对两张表有'RWXCA'权限
-- 若用户lemon也需获得hbase_ns下的权限,hbase管理员操作如下
-- 当前用户:hbase
hbase>grant 'lemon', 'W', '@hbase_ns'

-- 此时lemon可以在hbase_ns下创建表,但无法读、修改、删除hbase_ns下已存在的表
-- 当前用户:lemon
hbase>scan 'hbase_ns:table1'
-- AccessDeniedException 报错无权限

-- hbase管理员进行如下授权操作,lemon则可访问已经存在的表
-- 当前用户:hbase
hbase>grant 'alice', 'RW', 'hbase_ns.table1'
hbase>grant 'alice', 'RW', 'hbase_ns.table2'

配置hbase-site.xml启用授权机制,配置完成后需要重启HBase集群

property>
     name>hbase.security.authorization/name>
     value>true/value>
/property>
property>
     name>hbase.coprocessor.master.classes/name>
     value>org.apache.hadoop.hbase.security.access.AccessController/value>
/property>
property>
     name>hbase.coprocessor.region.classes/name>
  value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController/value>
/property>

文章来源于互联网:hbase 简介、HBASE重要概念、表Table、命名空间、Row Key,区域Region、列族、hbase shell命令行方式操作,命名空间操作

harry

这个人很懒,什么都没留下

文章评论