【转载】HBase基本概念和hbase shell常用命令用法
2015-09-01 11:39
711 查看
1.简介
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是GoogleBigtable的开源实现,它利用HadoopHDFS作为其文件存储系统,利用HadoopMapReduce来处理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可以看到详细的用法。
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文
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 |
相关文章推荐
- 已解决:登录Linux的 -bash-4.2$ 问题
- linux shell 编程 echo 语句 颜色
- 一个简单的shell脚本-----实现虚拟机实验环境的简单配置
- 一个简单的shell脚本-----实现虚拟机实验环境的简单配置
- 总结PowerShell的常用命令
- 数据输入/输出重定向
- linux C程序中获取shell脚本输出(如获取system命令输出)
- Android java代码中如何执行shell命令
- 让PowerShell2.0运行在.Net 4.0最简单的方法
- Bash笔记
- bash的环境变量配置文件
- Parameter expansion
- Linux系统Shell脚本编程
- 查找文件并执行的shell命令
- shell编程基础
- python shell 下转换 路径
- 设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限为 rwxr-xr—
- shell统计文本中单词的出现次数
- LINUX SHELL脚本攻略笔记[速查]
- bash基本语法及编译系统学习记录