AI智能
改变未来

Hbase入门教程,shell命令大全详解!

Hbase的基本语法
Hbase是一个面向列的非关系型数据库,采取Column Family(常译为列族/列簇)来对数据进行分类。

一个列族包含多个列,一个列族的多个列之间通常也具有某种关系,比如相似或同种类别。所以列族可以看作是某种分类(归类)。

每个类别里都会有具体的信息,它们就相当于一个个标识符(变量名),在Hbase中叫做Column Qualifier(列修饰符),列修饰符位于列族里面用来标识一条条数据。

在Hbase中一个列族(Column Family)和一个列修饰符(Column Qualifier)组合起来才叫一个(Column),使用冒号 : 分割,即 列族:列修饰符

在传统数据库中每一行的唯一标识符叫做主键,在Hbase中叫做row key(行键);数据在进入Hbase时都会被打上一个时间戳,这个时间戳可以作为版本号来使用。

一个行键列族列修饰符数据时间戳组合起来叫做一个单元格(Cell)。这里的行键、列族、列修饰符和时间戳其实可以看作是定位属性(类似坐标),最终确定了一个数据。

HBase里边也有表、行和列的概念。

表没什么好说的,就是一张表 ,
一行数据由一个行键和一个或多个相关的列以及它的值所组成

好了,现在比较抽象了。在HBase里边,定位一行数据会有一个唯一的值,这个叫做行键(RowKey)。而在HBase的列不是我们在关系型数据库所想象中的列。
HBase的列(Column)都得归属到列族(Column Family)中。在HBase中用列修饰符(Column Qualifier)来标识每个列。
在HBase里边,先有列族,后有列。

什么是列族?可以简单理解为:列的属性类别
什么是列修饰符?先有列族后有列,在列族下用列修饰符来标识一列

HBase表的每一行中,列的组成都是灵活的,行与行之间的列不需要相同。
换句话说:一个列族下可以任意添加列,不受任何限制
数据写到HBase的时候都会被记录一个时间戳,这个时间戳被我们当做一个版本。比如说,我们修改或者删除某一条的时候,本质上是往里边新增一条数据,记录的版本加一了而已。

现在要把这条记录的值改为40,实际上就是多添加一条记录,在读的时候按照时间戳读最新的记录。所以看起来就是把这条记录改了。

区域Region

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

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

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

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

存储单元 cell

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

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

hbase shell命令操作

进入hbase 操作界面
hbase shell
查看有哪些表
list

创建表
create ‘表名’, ‘列族名1’, ‘列族名2’, ‘列族名N’
create ‘test’,{NAME => ‘a1’, VERSIONS => 2},{NAME => ‘a2’, VERSIONS => 2}

添加列族 alter
alter ‘表名’, ‘列族名
alter ‘test’,‘userinfo’

删除列族
alter’表名’, {NAME=> ‘列族名’, METHOD=> ‘delete}
alter ‘test’,{NAME=> ‘userinfo’, METHOD=> ‘delete}

删除表
先关闭 disable ‘表’ ,在 drop ‘表’
disable \’test’
drop \’test’

查看表的结构
describe \’test’

查看表所有数据 scan
scan \’test’

查看单个列族
scan ‘test’ ,{COLUMN=>‘userinfo’}

获取某一行数据 get
get ‘test’,\’1’

获取某一行列族数据
get ‘test’,‘1’,\’userinfo’

Filter过滤器

显示hbase所支持的所有过滤器show_filters
过滤器用于get和scan命令中作为筛选数据的条件,类型关系型数据库中的where的作用

获取rowKey=r1 中的列值等于v2的所有列
get ‘test’,‘r1’, {FILTER => “ValueFilter(=, ’ binary:v2’)”}

获取test表中列值等于v2的所有信息
scan ‘test’, FILTER=>\”ValueFilter(=,‘binary:v2’)\”

查看test表中谁的列值包含88
scan ‘test’, FILTER=>\”ValueFilter(=,‘substring:88’)\”

ColumnPrefixFilter列修饰符前缀过滤器

查看test表中的列前缀为c2,列值包含88的用户
scan ‘test’, FILTER=>\”ColumnPrefixFilter(‘c2’) AND ValueFilter(=,‘substring:88’)\”

查看test表中的列前缀为s,列值包含123或者222的用户
scan ‘test’, FILTER=>\”ColumnPrefixFilter(‘s’) AND ( ValueFilter(=,‘substring:123’) OR ValueFilter(=,‘substring:222’) )\”

查看test表中,行键为user1开头的所有信息
scan ‘test’, FILTER => \”PrefixFilter (‘user1’)\”

查看test表中,从行键user开始,找到所有的rowkey以user1开头的信息
scan ‘test’, {STARTROW=>‘user’, FILTER => “PrefixFilter (‘user1’)”}

查看test表中,从行键user1开始找,找到所有的到行键uesr2之间的所有信息
scan ‘test’, {STARTROW=>‘user1’, STOPROW=>‘user2’}

修改表结构
必须先disable 关闭表
disable \’test’
alter ‘test’,{NAME=>‘userinfo’,age=>‘20’},{NAME=>‘callnum’, TTL=>‘15245667853’}
enable \’test’

表数据的增删改查

1.添加数据
给表a的添加一行记录:
语法:put < table>,< rowkey>,< family:column>,< value>,< timestamp>
put ‘a’,‘rowkey001’,‘f1:col1’,‘value01’ 时间戳系统默认

2.查询数据
查询表a,rowkey001中的f1下的col1的值
get ‘a’,‘rowkey001’, \’f1:col1’

3.查询表中的数据行数
语法:count < table>, {INTERVAL => intervalNum, CACHE => cacheNum}
INTERVAL设置多少行显示一次及对应的rowkey,默认1000;CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度
count ‘a’, {INTERVAL => 100, CACHE => 500}
解析:查询表a中的行数,每100条显示一次,缓存区为500

4.扫描表
语法:scan < table>, {COLUMNS => [ < family:column>,… ], LIMIT => num}
scan ‘a’,{LIMIT=>5}
解析:扫描表t1的前5条数据

5.删除数据
a.删除行中的某个列值
语法:delete < table>, < rowkey>, < family:column> , < timestamp> 必须指定列名
delete ‘a’,‘rowkey001’,\’f1:col1’
解析:删除表a,rowkey001中的f1:col1的数据

b.删除行
语法:delete < table>, < rowkey>, < family:column> , < timestamp> 可以不指定列名,删除整行数据
delete all ‘a’,\’rowkey001’
解析:删除表a,rowkey001中的所有数据

c.删除表中的所有数据
语法: truncate < table>
具体过程是:disable table -> drop table -> create table
truncate \’a’
解析:删除表a的所有数据

# 创建表,c1版本为4, 元数据mykey=myvaluehbase(main):009:0> create \'t1\', {NAME => \'c1\', VERSIONS => 4}, METADATA => { \'mykey\' => \'myvalue\' }0 row(s) in 2.2810 seconds=> Hbase::Table - t1# 添加列族c2, c3hbase(main):010:0> alter \'t1\', \'c2\', \'c3\'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.8320 seconds# 出入数据,c1 插入4个版本的值hbase(main):011:0> put \'t1\', \'r1\', \'c1\', \'v1\'0 row(s) in 0.1000 secondshbase(main):012:0> put \'t1\', \'r1\', \'c1\', \'v11\'0 row(s) in 0.0180 secondshbase(main):013:0> put \'t1\', \'r1\', \'c1\', \'v111\'0 row(s) in 0.0140 secondshbase(main):014:0> put \'t1\', \'r1\', \'c1\', \'v1111\'0 row(s) in 0.0140 seconds# 插入c2、c3的值hbase(main):015:0> put \'t1\', \'r1\', \'c2\', \'v2\'0 row(s) in 0.0140 secondshbase(main):016:0> put \'t1\', \'r1\', \'c3\', \'v3\'0 row(s) in 0.0210 seconds# 获取rowKey=r1的一行记录hbase(main):017:0> get \'t1\', \'r1\'COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111c2:                                                timestamp=1552819392398, value=v2c3:                                                timestamp=1552819398244, value=v33 row(s) in 0.0550 seconds# 获取rowKey=r1并且 1552819392398 <= 时间戳范围 < 1552819398244hbase(main):018:0> get \'t1\', \'r1\', {TIMERANGE => [1552819392398, 1552819398244]}COLUMN                                              CELLc2:                                                timestamp=1552819392398, value=v21 row(s) in 0.0090 seconds# 获取指定列的值hbase(main):019:0> get \'t1\', \'r1\', {COLUMN => \'c1\'}COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v11111 row(s) in 0.0160 seconds# 获取指定列的值,多个值使用数组表示hbase(main):020:0> get \'t1\', \'r1\', {COLUMN => [\'c1\', \'c2\', \'c3\']}COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111c2:                                                timestamp=1552819392398, value=v2c3:                                                timestamp=1552819398244, value=v33 row(s) in 0.0170 seconds# 获取c1的值,获取4个版本的值,默认是按照时间戳降续排序的hbase(main):021:0> get \'t1\', \'r1\', {COLUMN => \'c1\', VERSIONS => 4}COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111c1:                                                timestamp=1552819376343, value=v111c1:                                                timestamp=1552819368993, value=v11c1:                                                timestamp=1552819362975, value=v14 row(s) in 0.0180 seconds# 获取c1的3个版本值hbase(main):027:0* get \'t1\', \'r1\', {COLUMN => \'c1\', VERSIONS => 3}COLUMN                                               CELLc1:                                                 timestamp=1552819382575, value=v1111c1:                                                 timestamp=1552819376343, value=v111c1:                                                 timestamp=1552819368993, value=v113 row(s) in 0.0090 seconds# 获取指定时间戳版本的列hbase(main):022:0> get \'t1\', \'r1\', {COLUMN => \'c1\', TIMESTAMP => 1552819376343}COLUMN                                              CELLc1:                                                timestamp=1552819376343, value=v1111 row(s) in 0.0170 secondshbase(main):023:0> get \'t1\', \'r1\', {COLUMN => \'c1\', TIMESTAMP => 1552819376343, VERSIONS => 4}COLUMN                                              CELLc1:                                                timestamp=1552819376343, value=v1111 row(s) in 0.0130 seconds# 获取rowKey=r1中的值等于v2的所有列hbase(main):024:0> get \'t1\', \'r1\', {FILTER => \"ValueFilter(=, \'binary:v2\')\"}COLUMN                                              CELLc2:                                                timestamp=1552819392398, value=v21 row(s) in 0.0510 secondshbase(main):025:0> get \'t1\', \'r1\', {COLUMN => \'c1\', ATTRIBUTES => {\'mykey\'=>\'myvalue\'}}COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v11111 row(s) in 0.0100 seconds

namespace命令

  1. 列举命名空间
    list_namespace

  2. 获取命名空间描述
    describe_namespace

  3. 查看命名空间下的所有表
    list_namespace_tables

  4. 创建命名空间
    create_namespace \’test’

  5. 修改命名空间的属性
    alter_namespace ‘test’, {METHOD => ‘unset’, NAME=>‘PROPERTY_NAME’}

  6. 删除命名空间
    drop_namespace

权限管理
1)分配权限
权限用五个字母表示: “RWXCA”
READ(‘R’), WRITE(‘W’), EXEC(‘X’), CREATE(‘C’), ADMIN(‘A’)
grant ‘test’,‘RW’,\’a’
解析:给用户‘test’分配对表a有读写的权限

2)查看权限
user_permission \’a’
解析:查看表a的权限列表

3)收回权限
revoke ‘test’,\’a’
解析:收回test用户在表a上的权限

查询表中有多少行 count
count \’表名’

自增 incr
incr ‘表名’, ‘行键’, ‘列族:列名’, 步长值
注意:incr 可以对不存的行键操作,如果行键已经存在会报错,如果使用put修改了incr的值再使用incr也会报错
ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it’s 2 bytes wide

计数器 get_counter

# 点击量:日、周、月create \'counters\', \'daily\', \'weekly\', \'monthly\'incr \'counters\', \'20110101\', \'daily:hits\', 1incr \'counters\', \'20110101\', \'daily:hits\', 1get_counter \'counters\', \'20110101\', \'daily:hits\'

修饰词

1.COLUMNS: 查询同一个列族的多个列
语法:
scan ‘表名’, {COLUMNS => [ ‘列族名1:列名1’, ‘列族名1:列名2’, …]}
示例:scan ‘tbl_user’, {COLUMNS => [ ‘info:id’, ‘info:age’]}

2 TIMESTAMP 指定时间戳
语法:
scan ‘test’, {COLUMNS => ‘a1’, TIMESTAMP=> 1552818347657}

3 TIMERANGE 表示的是”>=开始时间 and <结束时间“
语法:
scan ‘表名’,{TIMERANGE=>[timestamp1, timestamp2]}

4 VERSIONS 版本
默认情况下一个列只能存储一个数据,后面如果修改数据就会将原来的覆盖掉,可以通过指定VERSIONS时HBase一列能存储多个值。

create \'test\', \'columnFamily\'describe \'test\'# 修改列族版本号alter \'test\', { NAME=>\'columnFamily\', VERSIONS=>3 }put \'test\', \'rowKey1\', \'columnFamily:column1\', \'value1\'put \'test\', \'rowKey1\', \'columnFamily:column1\', \'value2\'put \'test\', \'rowKey1\', \'columnFamily:column1\', \'value3\'# 默认返回最新的一条数据get \'test\',\'rowKey1\',\'columnFamily:column1\'# 返回3个get \'test\',\'rowKey1\',{COLUMN=>\'columnFamily:column1\', VERSIONS=>3}# 返回2个get \'test\',\'rowKey1\',{COLUMN=>\'columnFamily:column1\', VERSIONS=>2}

5 STARTROW 行键起始行
ROWKEY起始行。会先根据这个key定位到region,再向后扫描
语法:
scan ‘表名’, { STARTROW => ‘行键名’}

6 STOPROW :截止到STOPROW行,STOPROW行之前的数据,不包括STOPROW这行数据
语法:
scan ‘表名’, { STOPROW => ‘行键名’}

7 LIMIT 返回的行数
语法:
scan ‘表名’, { LIMIT => 行数}

HBase 常见错误

hbase shell在使用的时候经常会报错,这里列举了几个错误:
1.ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
使用jps查看是否有datanode服务
jps
删除hadoop 的临时目录
/opt/soft/hadoop260/tmp

2.ERROR: Can’t get master address from ZooKeeper; znode data == null
关闭hbase
stop-hbase.sh
重启hbase
start-hbase.sh
通过多次重启hbase服务或者是格式化namenode和DataNode,解决问题。

3.ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
解决办法1:
第一个问题,端口问题8020
hadoop默认的namenode 资源子接口是8020 端口,端口改成9000.

第二个问题,命名

修改配置文件hbase-site.xml
改成如图所示:hbase.root.dir

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Hbase入门教程,shell命令大全详解!