第六章 hbase shell 命令
hbase shell命令 | 描述 |
alter | 修改列族(Column Family)模式 |
count | 统计表中行的数量 |
create | 创建表 |
describe | 显示表相关的详细信息 |
delete | 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值) |
deleteall | 删除指定行的所有元素值 |
disable | 使表无效 |
drop | 删除表 |
enable | 使表有效 |
exists | 测试表是否存在 |
exit | 退出hbase shell |
get | 获取行或单元(cell)的值 |
incr | 增加指定表,行或列的值 |
list | 列出hbase中存在的所有表 |
put | 向指向的表单元添加值 |
tools | 列出hbase所支持的工具 |
scan | 通过对表的扫描来获取对用的值 |
status | 返回hbase集群的状态信息 |
shutdown | 关闭hbase集群(与exit不同) |
truncate | 重新创建指定表 |
version | 返回hbase版本信息 |
需要注意shutdown与exit之间的不同:shutdown表示关闭hbase服务,必须重新启动hbase才可以恢复,exit只是退出hbase shell,退出之后完全可以重新进入。
hbase使用坐标来定位表中的数据,行健是第一个坐标,下一个是列族。
hbase是一个在线系统,和hadoop mapreduce的紧密结合又赋予它离线访问的功能。
hbase接到命令后存下变化信息或者写入失败异常的抛出,默认情况下。执行写入时会写到两个地方:预写式日志(write-ahead log,也称hlog)和memStore,以保证数据持久化。memStore是内存里的写入缓冲区。客户端在写的过程中不会与底层的HFile直接交互,当menStore写满时,会刷新到硬盘,生成一个新的HFile.HFile是hbase使用的底层存储格式。menStore的大小由hbase-site.xml文件里的系统级属性hbase.hregion.memstore.flush.size来定义。
hbase在读操作上使用了LRU缓存机制(BlockCache),BlockCache设计用来保存从HFile里读入内存的频繁访问的数据,避免硬盘读。每个列族都有自己的BlockCache。BlockCache中的Block是hbase从硬盘完成一次读取的数据单位。Block是建立索引的最小数据单位,也是从硬盘读取的最小数据单位。如果主要用于随机查询,小一点的block会好一些,但是会导致索引变大,消耗更多内存,如果主要执行顺序扫描,大一点的block会好一些,block变大索引项变小,因此节省内存。
数据模型概括:
表(table)---------hbase用表来组织数据。表名是字符串(String),由可以在文件系统路径里使用的字符组成。
行(row)---------在表里,数据按行存储。行由行健(rowkey)唯一标识。行健没有数据类型,总是视为字节数组byte[].
列族(column family)-----------行里的数据按照列族分组,列族也影响到hbase数据的物理存放。因此,它们必须事前定义并且不轻易修改。表中每行拥有相同列族,尽管行不需要在每个列族里存储数据。列族名字是字符串,由可以在文件系统路径里使用的字符组成。
列限定符(column qualifier)--------列族里的数据通过列限定符或列来定位。列限定符不必事前定义。列限定符不必在不同行之间保持一致,就像行健一样,列限定符没有数据类型,总是视为字节数组byte[].
单元(cell)-------行健,列族和列限定符一起确定一个单元。存储在单元里的数据称为单元值(value),值也没有数据类型,总是视为字节数组byte[].
时间版本(version)--------单元值有时间版本,时间版本用时间戳标识,是一个long。没有指定时间版本时,当前时间戳作为操作的基本。hbase保留单元值时间版本的数量基于列族进行配置。默认数量是3个。
hbase在表里存储数据使用的是四维坐标系统,依次是:行健,列族,列限定符和时间版本。 hbase按照时间戳降序排列各时间版本,其他映射建按照升序排序。
hbase把数据存放在一个提供单一命名空间的分布式文件系统上。一张表由多个小一点的region组成,托管region的服务器叫做regionserver.单个region大小由配置参数hbase.hregion.max.filesize决定,当一个region大小变得大于该值时,会切分成2个region.
hbase是一种搭建在hadoop上的数据库。依靠hadoop来实现数据访问和数据可靠性。hbase是一种以低延迟为目标的在线系统,而hadoop是一种为吞吐量优化的离线系统。互补可以搭建水平扩展的数据应用。
hbase表设计:
hbase表很灵活,可以用字符数组形式存储任何东西。在同一列族里存储相似访问模式的所有东西。
索引建立在keyvalue对象的key部分上,key由行健,列限定符和时间戳按次序组成。高表可能支持你把运算复杂度降到O(1),但是要在原子性上付出代价。
hbase不支持跨行事务,列限定符可以用来存储数据,列族名字的长度影响了通过网络传回客户端的数据大小(在keyvalue对象里),所以尽量简练。
散列支持定长键和更好的数据分布,但是失去排序的好处。设计hbase模式时进行反规范化处理是一种可行的办法。从性能观点看,规范化为写做优化,而反规范化为读做优化。
1.创建表,其中users是表名,info是users的列族。hbase中的表至少有一个列族.它们之中,列族直接影响hbase数据存储的物理特性。
hbase(main):011:0>create 'users','info'
0 row(s) in 1.2210seconds
2.获得表的描述.通过list可以列出所有已创建的表
hbase(main):012:0>list
TABLE
users
1 row(s) in 0.0160seconds
3.使用describe命令可以看到这个表的所有默认参数
hbase(main):006:0>describe 'users'
DESCRIPTION ENABLED
{NAME => 'users', FAMILIES => [{NAME=> 'address', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', true
VERSIONS => '3', COMPRESSION => 'NONE',TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'fa
lse', BLOCKCACHE => 'true'}, {NAME =>'info', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSI
ONS => '3', COMPRESSION => 'NONE', TTL=> '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false',
BLOCKCACHE => 'true'}]}
1 row(s) in 0.0230seconds