HBase的SHELL操做和API

一、表結構: java

二、SHELL操做 shell

    命令:hbase shell 數據庫

  • 顯示錶:list apache

  • 建立表:create 'tb_name','column_family_1','column_family_2',...; 安全

    或者 create 'user', {NAME => 'column_family_1', VERSIONS => '3'} 服務器

  •  插入數據:put 'tb_name','rk_on','column_family : key','value' 異步

  • 獲取數據: 函數

                獲取全部數據:get 'tb_name','rk_on' oop

                獲取列族數據:get 'tb_name','rk_on','column_family' spa

                            或者 get 'tb_name', 'rk_on', {column=> ['cf_name1', 'cf_name2']}

                獲取列族中列數據:get 'tb_name','rk_on','column_family:key','column_family:column2',..

                            或者 get 'tb_name', 'rk_on', {COLUMN => ['cf_name:key', 'cf_name:key']}

                獲取各個版本的數據

                        列族版本:get 'tb_name', 'rk_on', {COLUMN => 'cf_name1', VERSIONS => Number}

                        列版本:get 'tb_name', 'rk_on', {COLUMN => 'cf_name1:c_name', VERSIONS => Number}

                        時間範圍內的列版本:get 'user', 'rk0001', {COLUMN => 'cfn:key', VERSIONS => Number, TIMERANGE => [1392368783980, 1392380169184]}       

                        VERSION:查詢版本數量

                        TIMERANGE:時間戳範圍

  • 徹底匹配:get 'tb_name', 'rk_on', {FILTER => "ValueFilter(=, 'binary:value')"}

                rk_on中含有value的信息

  • 匹配:get 'tb_name', 'rk_on', {FILTER => "(ValueFilter(=,'substring:a'))"}

                列示符中含有a的信息

  • scan查詢:

        scan 'tb_name'

        查詢user表中列族爲cfn的信息
        scan 'tb_name', {COLUMNS => 'cfn'}
        scan 'tb_name', {COLUMNS => 'cfn', RAW => true, VERSIONS => 5}
        scan 'tb_name', {COLUMNS => 'cfn', RAW => true, VERSIONS => 3}
        查詢user表中列族爲cfn1和cfn2的信息
        scan 'user', {COLUMNS => ['cfn1', 'cfn2']}
        scan 'user', {COLUMNS => ['cfn1:key1', 'cfn2:key2']}

        查詢user表中列族爲info、列標示符爲name的信息
        scan 'user', {COLUMNS => 'info:name'}

        查詢user表中列族爲info、列標示符爲name的信息,而且版本最新的5個
        scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

        查詢user表中列族爲info和data且列標示符中含有a字符的信息
        scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

        查詢user表中列族爲info,rk範圍是[rk0001, rk0003)的數據
        scan 'people', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

        查詢user表中row key以rk字符開頭的
        scan 'user',{FILTER=>"PrefixFilter('rk')"}

        查詢user表中指定範圍的數據
        scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
        

  • 刪除數據

        刪除user表row key爲rk0001,列標示符爲info:name的數據
        delete 'people', 'rk0001', 'info:name'
        刪除user表row key爲rk0001,列標示符爲info:name,timestamp爲1392383705316的數據
        delete 'user', 'rk0001', 'info:name', 1392383705316

  • 清空user表中的數據
    truncate 'people'

  • 修改表結構
    首先停用user表(新版本不用)
    disable 'user'

  • 添加兩個列族f1和f2
    alter 'people', NAME => 'f1'
    alter 'user', NAME => 'f2'

  • 啓用表
    enable 'user'

  • ###disable 'user'(新版本不用)
    刪除一個列族:
    alter 'user', NAME => 'f1', METHOD => 'delete' 或 alter 'user', 'delete' => 'f1'

  • 添加列族f1同時刪除列族f2
    alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

  • 將user表的f1列族版本號改成5
    alter 'people', NAME => 'info', VERSIONS => 5

  • 啓用表
    enable 'user'

  • 刪除表
    disable 'user'
    drop 'user'


二、API:

幾個相關類與HBase數據模型之間的對應關係

java類 HBase數據模型
HBaseAdmin 數據庫(DataBase)
HBaseConfiguration
HTable 表(Table)
HTableDescriptor 列族(Column Family)
Put 列修飾符(Column Qualifier)
Get
Scanner

 

1、HBaseConfiguration

關係:org.apache.hadoop.hbase.HBaseConfiguration

做用:對HBase進行配置

 返回值  函數  描述
 void  addResource(Path file)  經過給定的路徑所指的文件來添加資源
 void  clear()  清空全部已設置的屬性
 string  get(String name)  獲取屬性名對應的值
 String  getBoolean(String name, boolean defaultValue)  獲取爲boolean類型的屬性值,若是其屬性值類型部位boolean,則返回默認屬性值
 void  set(String name, String value)  經過屬性名來設置值
 void  setBoolean(String name, boolean value)  設置boolean類型的屬性值

 用法示例:

HBaseConfiguration hconfig = new HBaseConfiguration();
hconfig.set("hbase.zookeeper.property.clientPort","2181");

  該方法設置了"hbase.zookeeper.property.clientPort"的端口號爲2181。通常狀況下,HBaseConfiguration會使用構造函數進行初始化,而後在使用其餘方法。

2、HBaseAdmin

關係:org.apache.hadoop.hbase.client.HBaseAdmin

做用:提供了一個接口來管理HBase數據庫的表信息。它提供的方法包括:建立表,刪除表,列出表項,使表有效或無效,以及添加或刪除表列族成員等。

 返回值  函數  描述
      void  addColumn(String tableName, HColumnDescriptor column)  向一個已經存在的表添加咧
 checkHBaseAvailable(HBaseConfiguration conf)  靜態函數,查看HBase是否處於運行狀態
 createTable(HTableDescriptor desc)  建立一個表,同步操做
 deleteTable(byte[] tableName)  刪除一個已經存在的表
 enableTable(byte[] tableName)  使表處於有效狀態
 disableTable(byte[] tableName)  使表處於無效狀態
 HTableDescriptor[]  listTables()  列出全部用戶控件表項
 void  modifyTable(byte[] tableName, HTableDescriptor htd)  修改表的模式,是異步的操做,可能須要花費必定的時間
 boolean  tableExists(String tableName)  檢查表是否存在

用法示例:

HBaseAdmin admin = new HBaseAdmin(config);
admin.disableTable("tablename")

3、HTableDescriptor

關係:org.apache.hadoop.hbase.HTableDescriptor

做用:包含了表的名字極其對應表的列族

返回值 函數 描述
void addFamily(HColumnDescriptor) 添加一個列族
HColumnDescriptor removeFamily(byte[] column) 移除一個列族
byte[] getName() 獲取表的名字
byte[] getValue(byte[] key) 獲取屬性的值
void setValue(String key, String value) 設置屬性的值

用法示例:

HTableDescriptor htd = new HTableDescriptor(table);
htd.addFamily(new HcolumnDescriptor("family"));

在上述例子中,經過一個HColumnDescriptor實例,爲HTableDescriptor添加了一個列族:family

4、HColumnDescriptor

關係:org.apache.hadoop.hbase.HColumnDescriptor

做用:維護着關於列族的信息,例如版本號,壓縮設置等。它一般在建立表或者爲表添加列族的時候使用。列族被建立後不能直接修改,只能經過刪除而後從新建立的方式。列族被刪除的時候,列族裏面的數據也會同時被刪除。

返回值 函數 描述
byte[] getName() 獲取列族的名字
byte[] getValue(byte[] key) 獲取對應的屬性的值
void setValue(String key, String value) 設置對應屬性的值

用法示例:

HTableDescriptor htd = new HTableDescriptor(tablename);
HColumnDescriptor col = new HColumnDescriptor("content:");
htd.addFamily(col);

此例添加了一個content的列族

5、HTable

關係:org.apache.hadoop.hbase.client.HTable

做用:能夠用來和HBase表直接通訊。此方法對於更新操做來講是非線程安全的。

返回值 函數 描述
void checkAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put 自動的檢查row/family/qualifier是否與給定的值匹配
void close() 釋放全部的資源或掛起內部緩衝區中的更新
Boolean exists(Get get) 檢查Get實例所指定的值是否存在於HTable的列中
Result get(Get get) 獲取指定行的某些單元格所對應的值
byte[][] getEndKeys() 獲取當前一打開的表每一個區域的結束鍵值
ResultScanner getScanner(byte[] family) 獲取當前給定列族的scanner實例
HTableDescriptor getTableDescriptor() 獲取當前表的HTableDescriptor實例
byte[] getTableName() 獲取表名
static boolean isTableEnabled(HBaseConfiguration conf, String tableName) 檢查表是否有效
void put(Put put) 向表中添加值

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
ResultScanner scanner =  table.getScanner(family);

6、Put

關係:org.apache.hadoop.hbase.client.Put

做用:用來對單個行執行添加操做

返回值 函數 描述
Put add(byte[] family, byte[] qualifier, byte[] value) 將指定的列和對應的值添加到Put實例中
Put add(byte[] family, byte[] qualifier, long ts, byte[] value) 將指定的列和對應的值及時間戳添加到Put實例中
byte[] getRow() 獲取Put實例的行
RowLock getRowLock() 獲取Put實例的行鎖
long getTimeStamp() 獲取Put實例的時間戳
boolean isEmpty() 檢查familyMap是否爲空
Put setTimeStamp(long timeStamp) 設置Put實例的時間戳

用法示例:

HTable table = new HTable(conf,Bytes.toBytes(tablename));
Put p = new Put(brow);//爲指定行建立一個Put操做p.add(family,qualifier,value);
table.put(p);

7、Get

關係:org.apache.hadoop.hbase.client.Get

做用:用來獲取單個行的相關信息

返回值 函數 描述
Get addColumn(byte[] family, byte[] qualifier) 獲取指定列族和列修飾符對應的列
Get addFamily(byte[] family) 經過指定的列族獲取其對應列的全部列
Get setTimeRange(long minStamp,long maxStamp) 獲取指定取件的列的版本號
Get setFilter(Filter filter) 當執行Get操做時設置服務器端的過濾器

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
Get g = new Get(Bytes.toBytes(row));

8、Result

關係:org.apache.hadoop.hbase.client.Result

做用:存儲Get或者Scan操做後獲取表的單行值。使用此類提供的方法能夠直接獲取值或者各類Map結構(key-value對)

返回值 函數 描述
boolean containsColumn(byte[] family, byte[] qualifier) 檢查指定的列是否存在
NavigableMap<byte[],byte[]> getFamilyMap(byte[] family) 獲取對應列族所包含的修飾符與值的鍵值對
byte[] getValue(byte[] family, byte[] qualifier) 獲取對應列的最新值

9、ResultScanner

關係:Interface

做用:客戶端獲取值的接口

返回值 函數 描述
void close() 關閉scanner並釋放分配給它的資源
Result next() 獲取下一行的值

相關代碼:

package cn.itcast.hbase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;

public class HbaseDemo {

    private Configuration conf = null;
    
    @Before
    public void init(){
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "hadoop01,hadoop02,hadoop03");
    }
    
    @Test
    public void testDrop() throws Exception{
        HBaseAdmin admin = new HBaseAdmin(conf);
        admin.disableTable("account");
        admin.deleteTable("account");
        admin.close();
    }
    
    @Test
    public void testPut() throws Exception{
        HTable table = new HTable(conf, "user");
        Put put = new Put(Bytes.toBytes("rk0003"));
        put.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("liuyan"));
        table.put(put);
        table.close();
    }
    
    @Test
    public void testGet() throws Exception{
        //HTablePool pool = new HTablePool(conf, 10);
        //HTable table = (HTable) pool.getTable("user");
        HTable table = new HTable(conf, "user");
        Get get = new Get(Bytes.toBytes("rk0001"));
        //get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
        get.setMaxVersions(5);
        Result result = table.get(get);
        //result.getValue(family, qualifier)
        for(KeyValue kv : result.list()){
            String family = new String(kv.getFamily());
            System.out.println(family);
            String qualifier = new String(kv.getQualifier());
            System.out.println(qualifier);
            System.out.println(new String(kv.getValue()));
        }
        table.close();
    }
    
    @Test
    public void testScan() throws Exception{
        HTablePool pool = new HTablePool(conf, 10);
        HTableInterface table = pool.getTable("user");
        Scan scan = new Scan(Bytes.toBytes("rk0001"), Bytes.toBytes("rk0002"));
        scan.addFamily(Bytes.toBytes("info"));
        ResultScanner scanner = table.getScanner(scan);
        for(Result r : scanner){
            /**
            for(KeyValue kv : r.list()){
                String family = new String(kv.getFamily());
                System.out.println(family);
                String qualifier = new String(kv.getQualifier());
                System.out.println(qualifier);
                System.out.println(new String(kv.getValue()));
            }
            */
            byte[] value = r.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
            System.out.println(new String(value));
        }
        pool.close();
    }
    
    
    @Test
    public void testDel() throws Exception{
        HTable table = new HTable(conf, "user");
        Delete del = new Delete(Bytes.toBytes("rk0001"));
        del.deleteColumn(Bytes.toBytes("data"), Bytes.toBytes("pic"));
        table.delete(del);
        table.close();
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "hadoop01,hadoop02,hadoop03");
        HBaseAdmin admin = new HBaseAdmin(conf);
        HTableDescriptor td = new HTableDescriptor("account");
        HColumnDescriptor cd = new HColumnDescriptor("info");
        cd.setMaxVersions(10);
        td.addFamily(cd);
        admin.createTable(td);
        admin.close();

    }
    
    public void createTable(String tableName, int maxVersion, String... cf){
        
    }

}
相關文章
相關標籤/搜索