本文主要是介绍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),每个列族/列簇下面可以有多个普通列。
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上)组成。
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
3.2 help查看帮助
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 servershadoop4:SOURCE:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:44 CST 2020hadoop5:SOURCE:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:43 CST 2020
Took 0.0349 seconds
=> #<Java::JavaUtil::Collections::UnmodifiableSet:0x1109730f>
hbase(main):014:0> status 'replication', 'source'
version 2.0.2.3.1.4.0-315
2 live servershadoop4:SOURCE:hadoop5:SOURCE:
Took 0.0575 seconds
=> #<Java::JavaUtil::Collections::UnmodifiableSet:0x3ce7394f>
hbase(main):015:0> status 'replication','sink'
version 2.0.2.3.1.4.0-315
2 live servershadoop4:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:44 CST 2020hadoop5:SINK : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri May 15 18:08:43 CST 2020
Took 0.0504 seconds
=> #<Java::JavaUtil::Collections::UnmodifiableSet:0x68a426c3>
hbase(main):016:0>
3.4 list显示hbase中的表
list(列出你有哪些表)
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'}
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'
向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'
3.10 get 获取user表中row key为rk0001的所有信息
get 'namespaceName:tableName','rowKey','列族:列'get 'user', 'rk0001' (一次拿一行)
获取user表中row key为rk0001,info列族的所有信息
get 'user', 'rk0001', 'info'
获取user表中row key为rk0001,info列族的name、age列标示符的信息
get 'user', 'rk0001', 'info:name', 'info:age'
获取user表中row key为rk0001,info、data列族的信息
get 'user', 'rk0001', 'info', 'data'
get 'user', 'rk0001', {COLUMN => ['info', 'data']}
get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}
获取user表中row key为rk0001,列族为info,版本号最新5个的信息
get 'user', 'rk0001', {COLUMN => 'info', VERSIONS => 2}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5, TIMERANGE => [1488892553804, 1488892688096]}
获取user表中row key为rk0001,cell的值为zhangsan的信息
get 'people', 'rk0001', {FILTER => "ValueFilter(=, 'binary:图片')"}
获取user表中row key为rk0001,列标示符中含有a的信息
get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
put 'user', 'rk0002', 'info:name', 'fanbingbing'
put 'user', 'rk0002', 'info:gender', 'female'
put 'user', 'rk0002', 'info:nationality', '中国'
get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}
3.11 scan 查询user表中的所有信息
带有条数的scan
scan 'user', {LIMIT=>5}
scan 'namespaceName:tableName',{TIMERANGE => [1594201571000, 1594287971000]}
scan 'user'
查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}
查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
查询user表中row key以rk字符开头的
scan 'user',{FILTER=>"PrefixFilter('rk')"}
查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
3.12 delete删除数据
删除user表row key为rk0001,列标示符为info:name的数据
delete 'user', 'rk0001', 'info:name'
删除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 secondshbase(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=\xE4\xB8\xAD\xE5\x9B\xBD
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 secondshbase(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=\xE4\xB8\xAD\xE5\x9B\xBD
2 row(s) in 0.0510 secondshbase(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 => 10get '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'
常用操作之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命令行方式操作,命名空间操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!