[[TOC]]

一. 启动/停止HBase

  1. 手动在HBase安装目录的bin下执行:

    1. start-hbase.sh
    2. stop-hbase.sh
  2. jps 查看 java 进程, 如果没有停止成功, 用 kill -9 进程号 强行结束进程,再启动hbase

    二. shell表和列族操作命令

    1. 查询服务器状态

    1. hbase(main):011:0> status
    2. 1 active master, 0 backup masters, 1 servers, 0 dead, 4.0000 average load

    2. 查询版本

    1. hbase(main):012:0> version
    2. 1.2.1, r8d8a7107dc4ccbf36a92f64675dc60392f85c015, Wed Mar 30 11:19:21 CDT 2016

    3. 列出所有表 ``` hbase(main):014:0> list

stu table
test

  1. **4. 创建一个表**<br />_如果没有VERSIONS可以不用写大括号_

create

, {NAME => , VERSIONS => } hbase(main):013:0> create ‘ys_test2’,’prop’,’prop2’ 0 row(s) in 94.9160 seconds

  1. **5. 删除表**<br />5.1 分两步:首先disable 表名,然后drop 表名<br />例如:删除表 `ys_test2`

hbase(main)> disable ‘ys_test2’ hbase(main)> drop ‘ys_test2’

  1. 5.2 强制删除表<br />(1)查看zookeeper中表的信息

hbase zkcli

  1. 2)进入zookeeper命令行。然后

ls /hbase/table

  1. 3)删除目标表

rmr /hbase/table/TABLE_NAME

  1. **6. 查询表是否存在**

hbase(main):023:0> exists ‘ys_test2’ Table ys_test2 does exist 0 row(s) in 0.0380 seconds

  1. **7. 判断表是否enable, enable表**

hbase(main):025:0> is_enabled ‘ys_test2’ true 0 row(s) in 0.0150 seconds

  1. 把表设为enable

hbase(main):027:0> enable ‘ys_test2’ 0 row(s) in 33.2980 seconds

  1. **8.判断表是否disable, disable一个表**

hbase(main):026:0> is_disabled ‘ys_test2’ false
0 row(s) in 0.0140 seconds

  1. 把表设为disable

hbase(main):027:0> disable ‘ys_test2’ 0 row(s) in 33.2980 seconds

  1. **9.获得表的描述**

hbase(main):015:0> describe ‘ys_test2’ Table table is ENABLED
table
COLUMN FAMILIES DESCRIPTION …….

  1. **10. 修改表结构**<br />**修改表结构必须先disable表**<br />10.1 添加和删除列族<br />添加列族:

disable ‘ys_test2’ alter ‘ys_test2’, {NAME => ‘prop3’, VERSIONS =>3} enable ‘ys_test2’

  1. 删除列族:

disable ‘ys_test2’ alter ‘ys_test2’,{NAME=>’prop3’,METHOD=>’delete’} enable ‘ys_test2’

  1. 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秒。使用默认值的数据即为永久保留;例如,设置TTL10,即10秒,此时插入一条数据r1到表t1中,10秒之后r1将会被删除,如果r1有其他列,则其他列保留,TTL的概念只针对CELL<br />例如:修改表ys_test2的列族的TTL10000s

disable ‘ys_test2’ alter ‘ys_test2’,{NAME=>’prop’,TTL=>’10000’}, {NAME=>’prop2’,TTL=>’10’} enable ‘ys_test2’

  1. 测试:

put ‘ys_test2’ ,’1’,’prop:t1’,’1’ put ‘ys_test2’ ,’2’,’prop2:t1’,’1’ scan ‘ys_test2’

  1. **10.3 协处理加载**<br />换协处理器时需要先卸载,再加载<br />卸载:

disable ‘ys_test2’ alter ‘ys_test2’, METHOD => ‘table_att_unset’, NAME => ‘coprocessor$1’ enable ‘ys_test2’

  1. 加载:

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’

  1. **Java API:**<br />采用java代码为Hbase表增加协处理器,表的描述器HTableDescriptor类有一个增加协处理器的方法

public HTableDescriptor addCoprocessor(String className, Path jarFilePath, int priority, final Map kvs)

  1. 参数说明:

①className: 协处理器jar包的主类名 ②jarFilePath: 协处理器jar包所在路径 ③priority: 协处理器的优先级,默认多数情况下为 1001 ④kvs: 其他的参数如es_index、es_port、es_host等放在map中

  1. 实例代码:(代码中部分参数是与用户的交互输入)<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 map = new HashMap(); map.put(“es_cluster”, es_cluster); map.put(“es_index”, es_index); map.put(“es_port”, es_port); map.put(“es_host”, es_host); Path path = new Path(jar_path); hTableDescriptor.addCoprocessor(“com.hikvision.sparta.moirai.ontologyload.hbase2es.observer.HbaseDataSyncObserver”,path,1001,map); hBaseAdmin.modifyTable(tableName1, hTableDescriptor); hBaseAdmin.enableTable(tableName1); boolean isAddedCoprocessor = hTableDescriptor.hasCoprocessor(“com.hikvision.sparta.moirai.ontologyload.hbase2es.observer.HbaseDataSyncObserver”); if(isAddedCoprocessor) System.out.println(tableName + “ 成功加载协处理器”); }catch(IOException e){ e.printStackTrace(); } }

  1. 10.4 Hbase压缩方式添加<br />为HBase表添加、修改压缩方式:以表“wcy”为例,为其列族“prop”增加压缩方式GZ

disable ‘wcy’ alter‘wcy’, NAME => ‘prop’, COMPRESSION => ‘GZ’ enable ‘wcy’ major_compact ‘wcy’

  1. 添加完成后可以通过 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

  1. **11.权限管理**<br />11.1查看权限<br />语法:user_permission
  2. 例如,查看表t1的权限列表

hbase(main)> user_permission ‘ys_test2’

  1. 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’

  1. 11.3 收回权限<br />与分配权限类似,语法:`revoke <user> <table> <column family> <column qualifier>`<br />例如,收回test用户在表t1上的权限

hbase(main)> revoke ‘test’,’t1’

  1. <a name="z0S9H"></a>
  2. ## 三. shell数据操作##
  3. **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’

  1. **2. 删除数据**<br />2.1 删除行中的某个列值<br />语法:`delete <table>, <rowkey>, <family:column> , <timestamp>` 必须指定列名<br />例如:删除表t1rowkey001中的f1:col1的数据

hbase(main)> delete ‘ys_test2’,’rowkey001’, ‘prop:col1’

  1. _注:将删除f1:col1列所有版本的数据_<br />2.2 删除行<br />语法:`deleteall <table>, <rowkey>, <family:column> , <timestamp>`可以不指定列名,删除整行数据<br />例如:删除表t1rowk001的数据

hbase(main)> deleteall ‘ ys_test2’,’rowkey001’

  1. 2.3 删除表中的所有数据<br />语法: `truncate <table>`<br />其具体过程是:`disable table -> drop table -> create table`<br />例如:删除表t1的所有数据

hbase(main)> truncate ‘ys_test2’

  1. **3. 查询数据**<br />3.1查询表中有多少行

hbase(main):045:0> count ‘ys_test2’ 0 row(s) in 0.0450 seconds

  1. 语法:`count <table>,{INTERVAL => intervalNum, CACHE => cacheNum}`<br />INTERVAL设置多少行显示一次及对应的rowkey,默认1000CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度<br />例如,查询表t1中的行数,每100条显示一次,缓存区为500

hbase(main)> count ‘entity_table_check_mon_2’, {INTERVAL => 10000, CACHE => 5000}

  1. 3.2 扫描表<br />语法:`scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}`<br />另外,还可以添加STARTROWTIMERANGEFITLER等高级功能<br />例如:扫描表t1的前5条数据

hbase(main)> scan ‘entity_table_check_mon_2’,{ COLUMNS =>’prop’,LIMIT=>5}

  1. 3.3 get 查询某行记录<br />语法:`get <table>,<rowkey>,[<family:column>,....]`<br />例如:查询表t1rowkey001中的f1下的col1的值

hbase(main)> get ‘t1’,’rowkey001’, ‘f1:col1’ 或者: hbase(main)> get ‘t1’,’rowkey001’, {COLUMN=>’f1:col1’}

  1. 查询表t1rowke002中的f1下的所有列值

hbase(main)> get ‘ys_test2’,’1’

  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’]

  1. **4. filter功能**<br />组成部分: 比较运算符、比较器,可能还含有列族、列名<br />比较运算符:
  1. LESS (<)
  2. LESS_OR_EQUAL (<=)
  3. EQUAL (=)
  4. NOT_EQUAL (!=)
  5. GREATER_OR_EQUAL (>=)
  6. GREATER (>)
    1. 比较器:
    (1)二进制比较器:如’binary:abc’,按字典排序跟’abc’进行比较 (2)二进制前缀比较器:如’binaryprefix:abc’,按字典顺序只跟’abc’比较前3个字符 (3)正则表达式比较器:如’regexstring:ab*yz’,按正则表达式匹配以ab开头,以yz结尾的值。这个比较器只能使用=、!=两个比较运算符。 (4)子串比较器:如’substring:abc123’,匹配包含abc123。这个比较顺也只能使用=、!=两个比较运算符
    1. 4.1 值查询 ValueFilter<br />例子: 等于谁的值=6
    scan ‘entity_table_check_mon_2’, FILTER=>”ValueFilter(=,’binary:6’)”

ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188

  1. “=” 表示等于, 也可以有大于>, 小于<, 小于等于<=. 等等比较符号 注: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

  1. 谁的值以6结尾

scan ‘entity_table_check_mon_2’, FILTER=>”ValueFilter(=,’regexstring:.*6$’)”

  1. 4.2 rowkey filter<br />如上命令所示,查询的是表名为entity_table_check_mon_2,过滤方式是通过rowkey过滤,匹配出rowkey111的数据。

scan ‘entity_table_check_mon_2’, FILTER=>”RowFilter(=,’substring::6’)”

  1. 如上命令所示,查询的是表名为entity_table_check_mon_2,过滤方式是通过rowkey过滤,匹配出rowkey等于0111486816556的数据。

scan ‘entity_table_check_mon_2’, FILTER=>”RowFilter(=,’binary:0111486816556’)”

  1. 查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey小于等于0111486816556的数据。

scan ‘entity_table_check_mon_2’, FILTER=>”RowFilter(<=,’binary:0111486816556’)”

  1. 前缀过滤: 也可以用正则过滤来写:

scan ‘entity_table_check_mon_2’, FILTER=>”PrefixFilter(‘3702061957010112’)”

  1. 4.3 列族过滤: FamilyFilter<br />查询的是表名为ys_test,过滤方式是通过列簇过滤,匹配出列簇含p的数据。

scan ‘ys_test’, FILTER=>”FamilyFilter(=,’substring:p’)”

  1. 4.4 列过滤 ColumnPrefixFilterSingleColumnValueFilter<br />column'tongzhu'

scan ‘ys_test’, FILTER=>”ColumnPrefixFilter(‘tongzhu’)”

  1. 指定tongzhusu_rate大于0的; 列族,列名,运算符,比较器 这个命令不稳定

scan ‘ys_test’, FILTER=>”SingleColumnValueFilter (‘prop’,’ hotel_count’,>=,’binary:0’)”

  1. 替代:

scan ‘ys_test’, FILTER=>”ColumnPrefixFilter(‘hotel_count’) AND (ValueFilter(>=,’binary:0’) )”

  1. 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

  1. 通过搜索进来的(columns)值包含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

  1. **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=

  1. user1|ts2开始,找到所有的rowkeyuser1开头的

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

  1. user1|ts2开始,找到所有的到rowkeyuser2开头

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

  1. <a name="4VQiF"></a>
  2. ## 四. shell里面可以写命令行
  3. 查询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

  1. <a name="XYrHL"></a>
  2. ## 五. Region管理
  3. **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’

  1. **5.2 开启/关闭region**<br />语法:`balance_switch true|false`

hbase(main)> balance_switch

  1. **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’

  1. <a name="cEfSh"></a>
  2. ## 六: 备份:导入,导出,复制
  3. 不在shell里面, 是linux 命令行<br />导出:

hbase org.apache.hadoop.hbase.mapreduce.Export event_table_check_mon_2 /sparta/copy_data/event_table_check_mon

  1. 导入

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

  1. 例子:

bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable —starttime=1265875194289 —endtime=1265878794289 —peer.adr=server1,server2,server3:2181:/hbase TestTable ```