一. 启动/停止HBase
手动在HBase安装目录的bin下执行:
start-hbase.sh
stop-hbase.sh
jps
查看 java 进程, 如果没有停止成功, 用kill -9 进程号
强行结束进程,再启动hbase
二. shell表和列族操作命令
1. 查询服务器状态
hbase(main):011:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 4.0000 average load
2. 查询版本
hbase(main):012:0> version
1.2.1, r8d8a7107dc4ccbf36a92f64675dc60392f85c015, Wed Mar 30 11:19:21 CDT 2016
3. 列出所有表 ``` hbase(main):014:0> list
stu
table
test
**4. 创建一个表**<br />_如果没有VERSIONS可以不用写大括号_
create
, {NAME =>
**5. 删除表**<br />5.1 分两步:首先disable 表名,然后drop 表名<br />例如:删除表 `ys_test2`
hbase(main)> disable ‘ys_test2’ hbase(main)> drop ‘ys_test2’
5.2 强制删除表<br />(1)查看zookeeper中表的信息
hbase zkcli
(2)进入zookeeper命令行。然后
ls /hbase/table
(3)删除目标表
rmr /hbase/table/TABLE_NAME
**6. 查询表是否存在**
hbase(main):023:0> exists ‘ys_test2’ Table ys_test2 does exist 0 row(s) in 0.0380 seconds
**7. 判断表是否enable, enable表**
hbase(main):025:0> is_enabled ‘ys_test2’ true 0 row(s) in 0.0150 seconds
把表设为enable
hbase(main):027:0> enable ‘ys_test2’ 0 row(s) in 33.2980 seconds
**8.判断表是否disable, disable一个表**
hbase(main):026:0> is_disabled ‘ys_test2’
false
0 row(s) in 0.0140 seconds
把表设为disable
hbase(main):027:0> disable ‘ys_test2’ 0 row(s) in 33.2980 seconds
**9.获得表的描述**
hbase(main):015:0> describe ‘ys_test2’
Table table is ENABLED
table
COLUMN FAMILIES DESCRIPTION …….
**10. 修改表结构**<br />**修改表结构必须先disable表**<br />10.1 添加和删除列族<br />添加列族:
disable ‘ys_test2’ alter ‘ys_test2’, {NAME => ‘prop3’, VERSIONS =>3} enable ‘ys_test2’
删除列族:
disable ‘ys_test2’ alter ‘ys_test2’,{NAME=>’prop3’,METHOD=>’delete’} enable ‘ys_test2’
10.2 TTL(Time to live) 生存期<br />HBase中每个数据存储在一个CELL中,HBase可以设置每个CELL保存的最大version数,还可以设置version保存的最大时间TTL(Time To Live),生存期(TTL)设置了一个基于时间戳的临界值,内部的管理会自动检查TTL值是否达到上限,超过TTL的值会被删除;TTL参数设置的单位为秒,默认值是Integer.MAX_VALUE,即2147483647秒。使用默认值的数据即为永久保留;例如,设置TTL为10,即10秒,此时插入一条数据r1到表t1中,10秒之后r1将会被删除,如果r1有其他列,则其他列保留,TTL的概念只针对CELL<br />例如:修改表ys_test2的列族的TTL为10000s
disable ‘ys_test2’ alter ‘ys_test2’,{NAME=>’prop’,TTL=>’10000’}, {NAME=>’prop2’,TTL=>’10’} enable ‘ys_test2’
测试:
put ‘ys_test2’ ,’1’,’prop:t1’,’1’ put ‘ys_test2’ ,’2’,’prop2:t1’,’1’ scan ‘ys_test2’
**10.3 协处理加载**<br />换协处理器时需要先卸载,再加载<br />卸载:
disable ‘ys_test2’ alter ‘ys_test2’, METHOD => ‘table_att_unset’, NAME => ‘coprocessor$1’ enable ‘ys_test2’
加载:
disable ‘ys_test2’ alter ‘entity_table_check_mon_2’, METHOD => ‘table_att’, ‘coprocessor’ => ‘hdfs:///ys_test/sparta-moirai-hbase2es.jar|com.hikvision.sparta.moirai.ontologyload.hbase2es.observer.HbaseDataSyncObserver|1001|es_cluster=SERVICE-ELASTICSEARCH-d6b815c84b7b4619b03dfdb47f160f0e,es_index=entity_check_mon_2,es_port=9300,es_host=10.17.139.66’ enable ‘ys_test2’
**Java API:**<br />采用java代码为Hbase表增加协处理器,表的描述器HTableDescriptor类有一个增加协处理器的方法
public HTableDescriptor addCoprocessor(String className, Path jarFilePath, int priority, final Map
参数说明:
①className: 协处理器jar包的主类名 ②jarFilePath: 协处理器jar包所在路径 ③priority: 协处理器的优先级,默认多数情况下为 1001 ④kvs: 其他的参数如es_index、es_port、es_host等放在map中
实例代码:(代码中部分参数是与用户的交互输入)<br />函数参数:
scan: java的Scanner对象
tableName:要增加协处理器的Hbase中的表名
indexName:ES中与Hbase表名对应的索引名
public static void addCooperator(Scanner scan, String tableName, String indexName){
try{
Admin hBaseAdmin = con.getAdmin();
boolean isDisabled = hBaseAdmin.isTableDisabled(TableName.valueOf(tableName));
if(!isDisabled){
hBaseAdmin.disableTable(TableName.valueOf(tableName));
}
TableName tableName1 = TableName.valueOf(tableName);
HTableDescriptor hTableDescriptor =hBaseAdmin.getTableDescriptor(tableName1);
//参数1 jar包位置
System.out.println(“ ====>> 输入协处理sparta-moirai-hbase2es.jar所在位置(默认为hdfs:///sparta/moirai/coprocessor/all/sparta-moirai-hbase2es.jar): “);
String jar_path = scan.nextLine().trim();
if(jar_path.equals(“”)){
jar_path = “hdfs:///sparta/moirai/coprocessor/all/sparta-moirai-hbase2es.jar”;
}
//参数2 es_cluster名字
System.out.println(“ ====>> 输入es_cluster服务器名称(默认为SERVICE-ELASTICSEARCH-d6b815c84b7b4619b03dfdb47f160f0e): “);
String es_cluster = scan.nextLine().trim();
if(es_cluster.equals(“”)){
es_cluster = “SERVICE-ELASTICSEARCH-d6b815c84b7b4619b03dfdb47f160f0e”;
}
//参数3es_index es中对应于Hbase中实体表的索引名
System.out.println(“ ====>> 输入ES中与HBase对应的索引名(默认为” + indexName + “):”);
String es_index = scan.nextLine().trim();
if(es_index.equals(“”)){
es_index = indexName;
}
//参数4 es_port ES的端口号
System.out.println(“ ====>> 输入ES服务的端口号(默认为9300):”);
String es_port = scan.nextLine().trim();
if(es_port.equals(“”)){
es_port = “9300”;
}
//参数5 es_host
System.out.println(“ ====>> 输入ES服务的host(默认为10.33.36.94):”);
String es_host = scan.nextLine().trim();
if(es_host.equals(“”)){
es_host = “10.33.36.94”;
}
Map
10.4 Hbase压缩方式添加<br />为HBase表添加、修改压缩方式:以表“wcy”为例,为其列族“prop”增加压缩方式GZ。
disable ‘wcy’ alter‘wcy’, NAME => ‘prop’, COMPRESSION => ‘GZ’ enable ‘wcy’ major_compact ‘wcy’
添加完成后可以通过 describe ‘wcy’ 查看结果
hbase(main):001:0> describe ‘wcy’
Table wcy is ENABLED
wcy
COLUMN FAMILIES DESCRIPTION
{NAME => ‘pp’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’, REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘GZ’, MIN_VER
SIONS => ‘0’, TTL => ‘FOREVER’, KEEP_DELETED_CELLS => ‘FALSE’, BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
1 row(s) in 0.3360 seconds
**11.权限管理**<br />11.1查看权限<br />语法:user_permission
例如,查看表t1的权限列表
hbase(main)> user_permission ‘ys_test2’
11.2 分配权限<br />语法 :`grant <user> <permissions> <table> <column family> <column qualifier>` 参数后面用逗号分隔,权限用五个字母表示: `"RWXCA"`.<br />`READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')`<br />例如,给用户'test'分配对表t1有读写的权限:
hbase(main)> grant ‘test’,’RW’,’t1’
11.3 收回权限<br />与分配权限类似,语法:`revoke <user> <table> <column family> <column qualifier>`<br />例如,收回test用户在表t1上的权限
hbase(main)> revoke ‘test’,’t1’
<a name="z0S9H"></a>
## 三. shell数据操作##
**1. 添加数据**<br />语法: `put <table>,<rowkey>,<family:column>,<value>,<timestamp>`<br />例如:给表t1的添加一行记录:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系统默认
hbase(main)> put ‘ys_test2’,’rowkey001’,’prop:col1’,’value01’
**2. 删除数据**<br />2.1 删除行中的某个列值<br />语法:`delete <table>, <rowkey>, <family:column> , <timestamp>` 必须指定列名<br />例如:删除表t1,rowkey001中的f1:col1的数据
hbase(main)> delete ‘ys_test2’,’rowkey001’, ‘prop:col1’
_注:将删除f1:col1列所有版本的数据_<br />2.2 删除行<br />语法:`deleteall <table>, <rowkey>, <family:column> , <timestamp>`可以不指定列名,删除整行数据<br />例如:删除表t1,rowk001的数据
hbase(main)> deleteall ‘ ys_test2’,’rowkey001’
2.3 删除表中的所有数据<br />语法: `truncate <table>`<br />其具体过程是:`disable table -> drop table -> create table`<br />例如:删除表t1的所有数据
hbase(main)> truncate ‘ys_test2’
**3. 查询数据**<br />3.1查询表中有多少行
hbase(main):045:0> count ‘ys_test2’ 0 row(s) in 0.0450 seconds
语法:`count <table>,{INTERVAL => intervalNum, CACHE => cacheNum}`<br />INTERVAL设置多少行显示一次及对应的rowkey,默认1000;CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度<br />例如,查询表t1中的行数,每100条显示一次,缓存区为500
hbase(main)> count ‘entity_table_check_mon_2’, {INTERVAL => 10000, CACHE => 5000}
3.2 扫描表<br />语法:`scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}`<br />另外,还可以添加STARTROW、TIMERANGE和FITLER等高级功能<br />例如:扫描表t1的前5条数据
hbase(main)> scan ‘entity_table_check_mon_2’,{ COLUMNS =>’prop’,LIMIT=>5}
3.3 get 查询某行记录<br />语法:`get <table>,<rowkey>,[<family:column>,....]`<br />例如:查询表t1,rowkey001中的f1下的col1的值
hbase(main)> get ‘t1’,’rowkey001’, ‘f1:col1’ 或者: hbase(main)> get ‘t1’,’rowkey001’, {COLUMN=>’f1:col1’}
查询表t1,rowke002中的f1下的所有列值
hbase(main)> get ‘ys_test2’,’1’
其他案例:
hbase> get ‘t1′, ‘r1′ hbase> get ‘t1′, ‘r1′, {TIMERANGE => [ts1, ts2]} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′} hbase> get ‘t1′, ‘r1′, {COLUMN => [‘c1’, ‘c2’, ‘c3’]} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMERANGE => [ts1, ts2], VERSIONS => 4} hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1, VERSIONS => 4} hbase> get ‘t1′, ‘r1′, ‘c1′ hbase> get ‘t1′, ‘r1′, ‘c1′, ‘c2′ hbase> get ‘t1′, ‘r1′, [‘c1’, ‘c2’]
**4. filter功能**<br />组成部分: 比较运算符、比较器,可能还含有列族、列名<br />比较运算符:
- LESS (<)
- LESS_OR_EQUAL (<=)
- EQUAL (=)
- NOT_EQUAL (!=)
- GREATER_OR_EQUAL (>=)
- GREATER (>)
(1)二进制比较器:如’binary:abc’,按字典排序跟’abc’进行比较 (2)二进制前缀比较器:如’binaryprefix:abc’,按字典顺序只跟’abc’比较前3个字符 (3)正则表达式比较器:如’regexstring:ab*yz’,按正则表达式匹配以ab开头,以yz结尾的值。这个比较器只能使用=、!=两个比较运算符。 (4)子串比较器:如’substring:abc123’,匹配包含abc123。这个比较顺也只能使用=、!=两个比较运算符比较器:
scan ‘entity_table_check_mon_2’, FILTER=>”ValueFilter(=,’binary:6’)”4.1 值查询 ValueFilter<br />例子: 等于谁的值=6
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
“=” 表示等于, 也可以有大于>, 小于<, 小于等于<=. 等等比较符号 注:substring不能使用小于等于等符号。<br />谁的值包含李
scan ‘entity_table_check_mon_2’, FILTER=>”ValueFilter(=,’substring:李’)”
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
user2|ts5 column=sf:c2, timestamp=1409122355030, value=sku288
谁的值以6结尾
scan ‘entity_table_check_mon_2’, FILTER=>”ValueFilter(=,’regexstring:.*6$’)”
4.2 rowkey filter<br />如上命令所示,查询的是表名为entity_table_check_mon_2,过滤方式是通过rowkey过滤,匹配出rowkey含111的数据。
scan ‘entity_table_check_mon_2’, FILTER=>”RowFilter(=,’substring::6’)”
如上命令所示,查询的是表名为entity_table_check_mon_2,过滤方式是通过rowkey过滤,匹配出rowkey等于0111486816556的数据。
scan ‘entity_table_check_mon_2’, FILTER=>”RowFilter(=,’binary:0111486816556’)”
查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey小于等于0111486816556的数据。
scan ‘entity_table_check_mon_2’, FILTER=>”RowFilter(<=,’binary:0111486816556’)”
前缀过滤: 也可以用正则过滤来写:
scan ‘entity_table_check_mon_2’, FILTER=>”PrefixFilter(‘3702061957010112’)”
4.3 列族过滤: FamilyFilter<br />查询的是表名为ys_test,过滤方式是通过列簇过滤,匹配出列簇含p的数据。
scan ‘ys_test’, FILTER=>”FamilyFilter(=,’substring:p’)”
4.4 列过滤 ColumnPrefixFilter和SingleColumnValueFilter<br />column为'tongzhu'
scan ‘ys_test’, FILTER=>”ColumnPrefixFilter(‘tongzhu’)”
指定tongzhusu_rate大于0的; 列族,列名,运算符,比较器 这个命令不稳定
scan ‘ys_test’, FILTER=>”SingleColumnValueFilter (‘prop’,’ hotel_count’,>=,’binary:0’)”
替代:
scan ‘ys_test’, FILTER=>”ColumnPrefixFilter(‘hotel_count’) AND (ValueFilter(>=,’binary:0’) )”
4.4 and , or 以及其他过滤器<br />如上命令所示
scan ‘ys_test2’, FILTER=>”ColumnPrefixFilter(‘c2’) AND ValueFilter(=,’substring:88’)” ROW COLUMN+CELL
user2|ts5 column=sf:c2, timestamp=1409122355030, value=sku288
通过搜索进来的(column为s)值包含123或者222的用户
scan ‘ys_test2’, FILTER=>”ColumnPrefixFilter(‘s’) AND (ValueFilter(=,’substring:123’) OR ValueFilter(=,’substring:222’) )” ROW COLUMN+CELL
user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
user2|ts6 column=sf:s1, timestamp=1409122355970, value=sku222rowkey
**FirstKeyOnlyFilter:** 一个rowkey可以有多个version,同一个rowkey的同一个column也会有多个的值, 只拿出key中的第一个column的第一个version<br />**KeyOnlyFilter:** 只要key,不要value
scan ‘ys_test2’, FILTER=>”FirstKeyOnlyFilter() AND ValueFilter(=,’binary:sku188’) AND KeyOnlyFilter()” ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=
从user1|ts2开始,找到所有的rowkey以user1开头的
scan ‘ys_test2’, {STARTROW=>’user1:ts2’, FILTER => “PrefixFilter (‘user1’)”} ROW COLUMN+CELL
user1:ts2 column=sf:c1, timestamp=1409122354918, value=sku188
user1:ts3 column=sf:s1, timestamp=1409122354954, value=sku123
从user1|ts2开始,找到所有的到rowkey以user2开头
scan ‘ys_test2’, {STARTROW=>’user1:ts2’, STOPROW=>’user2’} ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
<a name="4VQiF"></a>
## 四. shell里面可以写命令行
查询rowkey里面包含ts3的
import org.apache.hadoop.hbase.filter.CompareFilter import org.apache.hadoop.hbase.filter.SubstringComparator import org.apache.hadoop.hbase.filter.RowFilter scan ‘ys_test2’, {FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf(‘EQUAL’), SubstringComparator.new(‘ts3’))} ROW COLUMN+CELL
user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
<a name="XYrHL"></a>
## 五. Region管理
**5.1 移动region**<br />语法:`move 'encodeRegionName', 'ServerName'`<br />encodeRegionName指的regioName后面的编码,ServerName指的是master-status的Region Servers列表<br />示例
hbase(main)>move ‘4343995a58be8e5bbc739af1e91cd72d’, ‘db-41.xxx.xxx.org,60020,1390274516739’
**5.2 开启/关闭region**<br />语法:`balance_switch true|false`
hbase(main)> balance_switch
**5.3 手动split**<br />语法:`split 'regionName', 'splitKey'`<br />**5.4 手动触发major compaction**<br />语法:
Compact all regions in a table: hbase> major_compact ‘t1’ Compact an entire region: hbase> major_compact ‘r1’ Compact a single column family within a region: hbase> major_compact ‘r1’, ‘c1’ Compact a single column family within a table: hbase> major_compact ‘t1’, ‘c1’
<a name="cEfSh"></a>
## 六: 备份:导入,导出,复制
不在shell里面, 是linux 命令行<br />导出:
hbase org.apache.hadoop.hbase.mapreduce.Export event_table_check_mon_2 /sparta/copy_data/event_table_check_mon
导入
hbase org.apache.hadoop.hbase.mapreduce.Import event_table_check_mon_2 hdfs://master66:8020/sparta/copy_data/event_table_check_mon $ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable [—starttime=X] [—endtime=Y] [—new.name=NEW] [—peer.adr=ADR] tablename
例子:
bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable —starttime=1265875194289 —endtime=1265878794289 —peer.adr=server1,server2,server3:2181:/hbase TestTable ```