HBase基本概念和hbase shell常用命令用法
2016-03-17 14:12
776 查看
1.简介
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是GoogleBigtable的开源实现,它利用HadoopHDFS作为其文件存储系统,利用Hadoop
MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
2.HBase的表结构
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(columnfamily)。
如上图所示,key1,key2,key3是三条记录的唯一的rowkey值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由rowkey1和column-family1-column1唯一确定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不一样,分别是t1,t2,hbase会返回最新时间的值给请求者。
这些名词的具体含义如下:
(1)RowKey
与nosql数据库们一样,rowkey是用来检索记录的主键。访问hbasetable中的行,只有三种方式:
(1.1)通过单个rowkey访问
(1.2)通过rowkey的range
(1.3)全表扫描
Rowkey行键(Rowkey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为10-100bytes),在hbase内部,rowkey保存为字节数组。
存储时,数据按照Rowkey的字典序(byteorder)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
注意:
字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
行的一次读写是原子操作(不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
(2)列族columnfamily
hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history,courses:math都属于courses这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
(3)单元Cell
HBase中通过row和columns确定的为一个存贮单元称为cell。由{rowkey,column(=<family>+<label>),version}唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
(4)时间戳timestamp
每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整型。时间戳可以由hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
3.HBaseshell的基本用法
hbase提供了一个shell的终端给用户交互。通过执行helpget可以看到命令的帮助信息。
以网上的一个学生成绩表的例子来演示hbase的用法。
这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族。图中需要注意的是90这个值,列族下面的列也是可以没有名字的。
(1)建立一个表格scores具有两个列族grad和courese
(2)查看当前HBase中具有哪些表
(3)查看表的构造
(4)加入一行数据,行名称为zkb列族grad的列名为””值位5
(5)给zkb这一行的数据的列族course添加一列<math,97>
(6)给zkb这一行的数据的列族course添加一列<art,87>
(7)加入一行数据,行名称为baoniu列族grad的列名为””值为4
(8)给baoniu这一行的数据的列族course添加一列<math,89>
(9)给Jerry这一行的数据的列族course添加一列<art,80>
(10)查看scores表中zkb的相关数据
(11)查看scores表中所有数据
注意:scan命令可以指定startrow,stoprow来scan多个row,例如:scan'user_test',{COLUMNS=>'info:username',LIMIT=>10,STARTROW=>'test',STOPROW=>'test2'}
(12)查看scores表中所有数据courses列族的所有数据
(13)删除scores表
总结下,hbaseshell常用的操作命令有create,describe,disable,drop,list,scan,put,get,delete,deleteall,count,status等,通过help可以看到详细的用法。
其他参考语法:
1.8.7-p357:001>scan'tbl_scores',{COLUMNS=>'coures:art',LIMIT=>1,STARTROW=>'nk'}
ROWCOLUMN+CELL
nkcolumn=coures:art,timestamp=1458187120824,value=100
scan'user_test',{COLUMNS=>'info:username',LIMIT=>10,STARTROW=>'test',STOPROW=>'test2'}
Someexamples:
hbase>scan'hbase:meta'
hbase>scan'hbase:meta',{COLUMNS=>'info:regioninfo'}
hbase>scan'ns1:t1',{COLUMNS=>['c1','c2'],LIMIT=>10,STARTROW=>'xyz'}
hbase>scan't1',{COLUMNS=>['c1','c2'],LIMIT=>10,STARTROW=>'xyz'}
hbase>scan't1',{COLUMNS=>'c1',TIMERANGE=>[1303668804,1303668904]}
hbase>scan't1',{REVERSED=>true}
hbase>scan't1',{ALL_METRICS=>true}
hbase>scan't1',{METRICS=>['RPC_RETRIES','ROWS_FILTERED']}
hbase>scan't1',{ROWPREFIXFILTER=>'row2',FILTER=>"
zblcolumn=coures:math,timestamp=1458186394469,value=100
本文转载自:http://archive.cnblogs.com/a/2178064/
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文
MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
2.HBase的表结构
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(columnfamily)。
RowKey | column-family1 | column-family2 | column-family3 | |||
column1 | column2 | column1 | column2 | column3 | column1 | |
key1 | t1:abc t2:gdxdf | t4:dfads t3:hello t2:world | ||||
key2 | t3:abc t1:gdxdf | t4:dfads t3:hello | t2:dfdsfa t3:dfdf | |||
key3 | t2:dfadfasd t1:dfdasddsf | t2:dfxxdfasd t1:taobao.com |
这些名词的具体含义如下:
(1)RowKey
与nosql数据库们一样,rowkey是用来检索记录的主键。访问hbasetable中的行,只有三种方式:
(1.1)通过单个rowkey访问
(1.2)通过rowkey的range
(1.3)全表扫描
Rowkey行键(Rowkey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为10-100bytes),在hbase内部,rowkey保存为字节数组。
存储时,数据按照Rowkey的字典序(byteorder)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
注意:
字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
行的一次读写是原子操作(不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
(2)列族columnfamily
hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history,courses:math都属于courses这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
(3)单元Cell
HBase中通过row和columns确定的为一个存贮单元称为cell。由{rowkey,column(=<family>+<label>),version}唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
(4)时间戳timestamp
每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整型。时间戳可以由hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
3.HBaseshell的基本用法
hbase提供了一个shell的终端给用户交互。通过执行helpget可以看到命令的帮助信息。
以网上的一个学生成绩表的例子来演示hbase的用法。
name | grad | course | |
math | art | ||
zkb | 5 | 97 | 87 |
baoniu | 4 | 89 | 80 |
(1)建立一个表格scores具有两个列族grad和courese
hbase(main): 001 : 0 >create 'scores' , 'grade' , 'course' |
0 row(s)in 0.4780 seconds |
hbase(main): 002 : 0 >list |
TABLE |
scores |
1 row(s)in 0.0270 seconds |
hbase(main): 004 : 0 >describe 'scores' |
DESCRIPTIONENABLED |
{NAME=> 'scores' ,FAMILIES=>[{NAME=> 'course' ,BLOOMFILTER=> 'NONE' ,REPLICATION_SCOPE=> '0' , true |
COMPRESSION=> 'NONE' ,VERSIONS=> '3' ,TTL=> '2147483647' ,BLOCKSIZE=> '65536' ,IN_MEMORY=>'fal |
se ',BLOCKCACHE=>' true '},{NAME=>' grade ',BLOOMFILTER=>' NONE ',REPLICATION_SCOPE=>' 0 ',COMPR |
ESSION=> 'NONE' ,VERSIONS=> '3' ,TTL=> '2147483647' ,BLOCKSIZE=> '65536' ,IN_MEMORY=> 'false' , |
BLOCKCACHE=> 'true' }]} |
1 row(s)in 0.0390 seconds |
hbase(main): 006 : 0 >put 'scores' , 'zkb' , 'grade:' , '5' |
0 row(s)in 0.0420 seconds |
hbase(main): 007 : 0 >put 'scores' , 'zkb' , 'course:math' , '97' |
0 row(s)in 0.0270 seconds |
hbase(main): 008 : 0 >put 'scores' , 'zkb' , 'course:art' , '87' |
0 row(s)in 0.0260 seconds |
hbase(main): 009 : 0 >put 'scores' , 'baoniu' , 'grade:' , '4' |
0 row(s)in 0.0260 seconds |
hbase(main): 010 : 0 >put 'scores' , 'baoniu' , 'course:math' , '89' |
0 row(s)in 0.0270 seconds |
hbase(main): 011 : 0 >put 'scores' , 'baoniu' , 'course:art' , '80' |
0 row(s)in 0.0270 seconds |
hbase(main): 012 : 0 >get 'scores' , 'zkb' |
COLUMNCELL |
course:arttimestamp= 1316100110921 ,value= 87 |
course:mathtimestamp= 1316100025944 ,value= 97 |
grade:timestamp= 1316099975625 ,value= 5 |
3 row(s)in 0.0480 seconds |
注意:scan命令可以指定startrow,stoprow来scan多个row,例如:scan'user_test',{COLUMNS=>'info:username',LIMIT=>10,STARTROW=>'test',STOPROW=>'test2'}
hbase(main): 013 : 0 >scan 'scores' |
ROWCOLUMN+CELL |
baoniucolumn=course:art,timestamp= 1316100293784 ,value= 80 |
baoniucolumn=course:math,timestamp= 1316100234410 ,value= 89 |
baoniucolumn=grade:,timestamp= 1316100178609 ,value= 4 |
zkbcolumn=course:art,timestamp= 1316100110921 ,value= 87 |
zkbcolumn=course:math,timestamp= 1316100025944 ,value= 97 |
zkbcolumn=grade:,timestamp= 1316099975625 ,value= 5 |
2 row(s)in 0.0470 seconds |
hbase(main): 017 : 0 >scan 'scores' ,{COLUMNS=> 'course' } |
ROWCOLUMN+CELL |
baoniucolumn=course:art,timestamp= 1316100293784 ,value= 80 |
baoniucolumn=course:math,timestamp= 1316100234410 ,value= 89 |
zkbcolumn=course:art,timestamp= 1316100110921 ,value= 87 |
zkbcolumn=course:math,timestamp= 1316100025944 ,value= 97 |
2 row(s)in 0.0350 seconds |
hbase(main): 024 : 0 >disable 'scores' |
0 row(s)in 0.0330 seconds |
hbase(main): 025 : 0 >drop 'scores' |
0 row(s)in 1.0840 seconds |
其他参考语法:
1.8.7-p357:001>scan'tbl_scores',{COLUMNS=>'coures:art',LIMIT=>1,STARTROW=>'nk'}
ROWCOLUMN+CELL
nkcolumn=coures:art,timestamp=1458187120824,value=100
scan'user_test',{COLUMNS=>'info:username',LIMIT=>10,STARTROW=>'test',STOPROW=>'test2'}
Someexamples:
hbase>scan'hbase:meta'
hbase>scan'hbase:meta',{COLUMNS=>'info:regioninfo'}
hbase>scan'ns1:t1',{COLUMNS=>['c1','c2'],LIMIT=>10,STARTROW=>'xyz'}
hbase>scan't1',{COLUMNS=>['c1','c2'],LIMIT=>10,STARTROW=>'xyz'}
hbase>scan't1',{COLUMNS=>'c1',TIMERANGE=>[1303668804,1303668904]}
hbase>scan't1',{REVERSED=>true}
hbase>scan't1',{ALL_METRICS=>true}
hbase>scan't1',{METRICS=>['RPC_RETRIES','ROWS_FILTERED']}
hbase>scan't1',{ROWPREFIXFILTER=>'row2',FILTER=>"
zblcolumn=coures:math,timestamp=1458186394469,value=100
本文转载自:http://archive.cnblogs.com/a/2178064/
相关文章推荐
- Github Bash
- 交互式SHELL和非交互式SHELL、登录SHELL和非登录SHELL的区别
- -bash:ssh:command not found
- Shell学习笔记
- ruby引入shell命令
- linux shell 指令 诸如-d, -f, -e之类的判断表达式
- shell脚本----语法初探之1
- shell练习
- shell脚本定时删除指定文件
- 使用Git Bash for Windows
- shell 操作(四)
- Powershell 批量导入AD账户
- AIX 5.3 中非root用户用bash报错问题及bash升级与老版本冲突问题处理方法
- webshell下执行命令脚本汇集
- Shell - 5
- 最近用到的shell命令总结
- 用shell脚本创建用户
- 在Python中调用shell命令及 获取python命令中的参数
- 打印九九乘法表
- shell中记录运行时间的一种方法