一、进入HBase命令行
在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端
[admin@node21 ~]$ hbase shell SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/module/hbase-1.2.6/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
1.8.7-p357 :001 >
说明,先看一下提示。其实是不是有一句很重要的话:
HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell
讲述了怎么获得帮助,怎么退出客户端
help 获取帮助
help:获取所有命令提示
help "dml" :获取一组命令的提示
help "put" :获取一个单独命令的提示帮助
exit 退出 hbase shell 客户端
二、HBase表的操作
这些是关于HBase在表中操作的命令。
- create: 创建一个表。
- list: 列出HBase的所有表。
- disable: 禁用表。
- is_disabled: 验证表是否被禁用。
- enable: 启用一个表。
- is_enabled: 验证表是否已启用。
- describe: 提供了一个表的描述。
- alter: 改变一个表。
- exists: 验证表是否存在。
- drop: 从HBase中删除表。
- drop_all: 丢弃在命令中给出匹配“regex”的表。
- Java Admin API: 在此之前所有的上述命令,Java提供了一个通过API编程来管理实现DDL功能。在这个org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor 这两个重要的类提供DDL功能。
关于表的操作包括(创建create,查看表列表list。查看表的详细信息desc,删除表drop,清空表truncate,修改表的定义alter)
1、创建表create
可以输入以下命令进行查看帮助命令
1.8.7-p357 :001 > help 'create'
Creates a table. Pass a table name, and a set of column family specifications (at least one), and, optionally, table configuration. Column specification can be a simple string (name), or a dictionary (dictionaries are described below in main help output), necessarily including NAME attribute. Examples: Create a table with namespace=ns1 and table qualifier=t1 hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5} Create a table with namespace=default and table qualifier=t1 hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'} hbase> # The above in shorthand would be the following: hbase> create 't1', 'f1', 'f2', 'f3' hbase> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true} hbase> create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}} Table configuration options can be put at the end. Examples: hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe' hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' } hbase> # Optionally pre-split the table into NUMREGIONS, using hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname) hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', REGION_REPLICATION => 2, CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand ' => 'true'}} hbase> create 't1', {NAME => 'f1', DFS_REPLICATION => 1} You can also keep around a reference to the created table: hbase> t1 = create 't1', 'f1' Which gives you a reference to the table named 't1', on which you can then call methods. 1.8.7-p357 :002 >
可以看到其中一条提示
hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
其中t1是表名,f1,f2,f3是列簇的名,如:
1.8.7-p357 :002 > create 'myHbase',{NAME => 'myCard',VERSIONS => 5} 0 row(s) in 9.1260 seconds => Hbase::Table - myHbase 1.8.7-p357 :003 >
创建了一个名为myHbase的表,表里面有1个列簇,名为myCard,保留5个版本信息
2、查看表列表list
可以输入以下命令进行查看帮助命令
1.8.7-p357 :003 > help 'list' List all tables in hbase. Optional regular expression parameter could be used to filter the output. Examples: hbase> list hbase> list 'abc.*' hbase> list 'ns:abc.*' hbase> list 'ns:.*' 1.8.7-p357 :004 >
直接输入list进行查看
1.8.7-p357 :004 > list TABLE myHbase 1 row(s) in 0.0610 seconds => ["myHbase"] 1.8.7-p357 :005 >
只有一条结果,就是刚刚创建的表myHbase
3、查看表详细信息desc
一个大括号,就相当于一个列簇。
1.8.7-p357 :005 > desc 'myHbase' Table myHbase is ENABLED myHbase COLUMN FAMILIES DESCRIPTION {NAME => 'myCard', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRES SION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 1 row(s) in 0.5470 seconds 1.8.7-p357 :006 >
4、修改表定义alter
添加一个列簇
1.8.7-p357 :006 > alter 'myHbase', NAME => 'myInfo' Updating all regions with the new schema... 0/1 regions updated. 1/1 regions updated. Done. 0 row(s) in 3.6430 seconds 1.8.7-p357 :007 > desc 'myHbase' Table myHbase is ENABLED myHbase COLUMN FAMILIES DESCRIPTION {NAME => 'myCard', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRES SION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} {NAME => 'myInfo', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRES SION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 2 row(s) in 0.1080 seconds 1.8.7-p357 :008 >
删除一个列簇
1.8.7-p357 :008 > alter 'myHbase', NAME => 'myCard', METHOD => 'delete' Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 2.7110 seconds 1.8.7-p357 :009 > desc 'myHbase' Table myHbase is ENABLED myHbase COLUMN FAMILIES DESCRIPTION {NAME => 'myInfo', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRES SION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 1 row(s) in 0.0510 seconds 1.8.7-p357 :010 >
删除一个列簇也可以执行以下命令
alter 'myHbase', 'delete' => 'myCard'
添加列簇hehe同时删除列簇myInfo
1.8.7-p357 :010 > alter 'myHbase', {NAME => 'hehe'}, {NAME => 'myInfo', METHOD => 'delete'} Updating all regions with the new schema... 1/1 regions updated. Done. Updating all regions with the new schema... 0/1 regions updated. 1/1 regions updated. Done. 0 row(s) in 5.5340 seconds 1.8.7-p357 :011 > desc 'myHbase' Table myHbase is ENABLED myHbase COLUMN FAMILIES DESCRIPTION {NAME => 'hehe', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSI ON => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 1 row(s) in 0.0520 seconds 1.8.7-p357 :012 >
5、truncate清空表
1.8.7-p357 :012 > truncate 'myHbase' Truncating 'myHbase' table (it may take a while): - Disabling table... - Truncating table... 0 row(s) in 8.6040 seconds 1.8.7-p357 :013 >
6、删除表drop
1.8.7-p357 :013 > drop 'myHbase' ERROR: Table myHbase is enabled. Disable it first. Here is some help for this command: Drop the named table. Table must first be disabled: hbase> drop 't1' hbase> drop 'ns1:t1' 1.8.7-p357 :014 >
直接删除表会报错,根据提示需要先停用表
1.8.7-p357 :014 > disable 'myHbase' 0 row(s) in 2.3470 seconds 1.8.7-p357 :015 > drop 'myHbase' 0 row(s) in 1.3850 seconds 1.8.7-p357 :016 > list TABLE 0 row(s) in 0.0110 seconds => [] 1.8.7-p357 :017 >
三、HBase表中数据的操作
- put: 把指定列在指定的行中单元格的值在一个特定的表。
- get: 取行或单元格的内容。
- delete: 删除表中的单元格值。
- deleteall: 删除给定行的所有单元格。
- scan: 扫描并返回表数据。
- count: 计数并返回表中的行的数目。
- truncate: 禁用,删除和重新创建一个指定的表。
- Java client API: 在此之前所有上述命令,Java提供了一个客户端API来实现DML功能,CRUD(创建检索更新删除)操作更多的是通过编程,在org.apache.hadoop.hbase.client包下。 在此包HTable 的 Put和Get是重要的类。
关于数据的操作(增put,删delete,查get + scan, 改==变相的增加)
创建 user 表,包含 info、data 两个列簇
1.8.7-p357 :017 > create 'user_info',{NAME=>'base_info',VERSIONS=>3 },{NAME=>'extra_info',VERSIONS=>1 } 0 row(s) in 4.3020 seconds => Hbase::Table - user_info 1.8.7-p357 :018 >
1、增put
查看帮助,需要传入表名,rowkey,列簇名、值等
1.8.7-p357 :018 > help 'put' Put a cell 'value' at specified table/row/column and optionally timestamp coordinates. To put a cell value into table 'ns1:t1' or 't1' at row 'r1' under column 'c1' marked with the time 'ts1', do: hbase> put 'ns1:t1', 'r1', 'c1', 'value' hbase> put 't1', 'r1', 'c1', 'value' hbase> put 't1', 'r1', 'c1', 'value', ts1 hbase> put 't1', 'r1', 'c1', 'value', {ATTRIBUTES=>{'mykey'=>'myvalue'}} hbase> put 't1', 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}} hbase> put 't1', 'r1', 'c1', 'value', ts1, {VISIBILITY=>'PRIVATE|SECRET'} The same commands also can be run on a table reference. Suppose you had a reference t to table 't1', the corresponding command would be: hbase> t.put 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}} 1.8.7-p357 :019 >
向 user 表中插入信息,row key 为 user0001,列簇 base_info 中添加 name 列标示符,值为 zhangsan1
1.8.7-p357 :019 > put 'user_info', 'user0001', 'base_info:name', 'zhangsan1' 0 row(s) in 0.6590 seconds 1.8.7-p357 :020 >
此处可以多添加几条数据
put 'user_info', 'zhangsan_20150701_0001', 'base_info:name', 'zhangsan1' put 'user_info', 'zhangsan_20150701_0002', 'base_info:name', 'zhangsan2' put 'user_info', 'zhangsan_20150701_0003', 'base_info:name', 'zhangsan3' put 'user_info', 'zhangsan_20150701_0004', 'base_info:name', 'zhangsan4' put 'user_info', 'zhangsan_20150701_0005', 'base_info:name', 'zhangsan5' put 'user_info', 'zhangsan_20150701_0006', 'base_info:name', 'zhangsan6' put 'user_info', 'zhangsan_20150701_0007', 'base_info:name', 'zhangsan7' put 'user_info', 'zhangsan_20150701_0008', 'base_info:name', 'zhangsan8' put 'user_info', 'zhangsan_20150701_0001', 'base_info:age', '21' put 'user_info', 'zhangsan_20150701_0002', 'base_info:age', '22' put 'user_info', 'zhangsan_20150701_0003', 'base_info:age', '23' put 'user_info', 'zhangsan_20150701_0004', 'base_info:age', '24' put 'user_info', 'zhangsan_20150701_0005', 'base_info:age', '25' put 'user_info', 'zhangsan_20150701_0006', 'base_info:age', '26' put 'user_info', 'zhangsan_20150701_0007', 'base_info:age', '27' put 'user_info', 'zhangsan_20150701_0008', 'base_info:age', '28' put 'user_info', 'zhangsan_20150701_0001', 'extra_info:Hobbies', 'music' put 'user_info', 'zhangsan_20150701_0002', 'extra_info:Hobbies', 'sport' put 'user_info', 'zhangsan_20150701_0003', 'extra_info:Hobbies', 'music' put 'user_info', 'zhangsan_20150701_0004', 'extra_info:Hobbies', 'sport' put 'user_info', 'zhangsan_20150701_0005', 'extra_info:Hobbies', 'music' put 'user_info', 'zhangsan_20150701_0006', 'extra_info:Hobbies', 'sport' put 'user_info', 'zhangsan_20150701_0007', 'extra_info:Hobbies', 'music' put 'user_info', 'baiyc_20150716_0001', 'base_info:name', 'baiyc1' put 'user_info', 'baiyc_20150716_0002', 'base_info:name', 'baiyc2' put 'user_info', 'baiyc_20150716_0003', 'base_info:name', 'baiyc3' put 'user_info', 'baiyc_20150716_0004', 'base_info:name', 'baiyc4' put 'user_info', 'baiyc_20150716_0005', 'base_info:name', 'baiyc5' put 'user_info', 'baiyc_20150716_0006', 'base_info:name', 'baiyc6' put 'user_info', 'baiyc_20150716_0007', 'base_info:name', 'baiyc7' put 'user_info', 'baiyc_20150716_0008', 'base_info:name', 'baiyc8' put 'user_info', 'baiyc_20150716_0001', 'base_info:age', '21' put 'user_info', 'baiyc_20150716_0002', 'base_info:age', '22' put 'user_info', 'baiyc_20150716_0003', 'base_info:age', '23' put 'user_info', 'baiyc_20150716_0004', 'base_info:age', '24' put 'user_info', 'baiyc_20150716_0005', 'base_info:age', '25' put 'user_info', 'baiyc_20150716_0006', 'base_info:age', '26' put 'user_info', 'baiyc_20150716_0007', 'base_info:age', '27' put 'user_info', 'baiyc_20150716_0008', 'base_info:age', '28' put 'user_info', 'baiyc_20150716_0001', 'extra_info:Hobbies', 'music' put 'user_info', 'baiyc_20150716_0002', 'extra_info:Hobbies', 'sport' put 'user_info', 'baiyc_20150716_0003', 'extra_info:Hobbies', 'music' put 'user_info', 'baiyc_20150716_0004', 'extra_info:Hobbies', 'sport' put 'user_info', 'baiyc_20150716_0005', 'extra_info:Hobbies', 'music' put 'user_info', 'baiyc_20150716_0006', 'extra_info:Hobbies', 'sport' put 'user_info', 'baiyc_20150716_0007', 'extra_info:Hobbies', 'music' put 'user_info', 'baiyc_20150716_0008', 'extra_info:Hobbies', 'sport'