HBASE學習筆記--API

HBaseConfigurationjava

HBaseConfiguration是每個hbase client都會使用到的對象,它表明的是HBase配置信息。它有兩種構造方式:api

public HBaseConfiguration()數組

public HBaseConfiguration(final Configuration c)dom

 

默認的構造方式會嘗試從hbase-default.xml和hbase-site.xml中讀取配置。若是classpath沒有這兩個文件,就須要你本身設置配置。eclipse

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(「hbase.zookeeper.quorum」, 「zkServer」);

HBASE_CONFIG.set(「hbase.zookeeper.property.clientPort」, 「2181″);

HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

 

 

增長family異步

經過 HTableDescriptor的 addFamily方法函數

public void addFamily(final HColumnDescriptor family)性能

HColumnDescriptor 表明的是column的schema,提供的方法比較經常使用的有學習

setTimeToLive:指定最大的TTL,單位是ms,過時數據會被自動刪除。測試

setInMemory:指定是否放在內存中,對小表有用,可用於提升效率。默認關閉

setBloomFilter:指定是否使用BloomFilter,可提升隨機查詢效率。默認關閉

setCompressionType:設定數據壓縮類型。默認無壓縮。

setMaxVersions:指定數據最大保存的版本個數。默認爲3。

 

建表 api:

void createTable(HTableDescriptor desc) 

void createTable(HTableDescriptor desc, byte[] startKey,byte[] endKey, int numRegions) 

void createTable(HTableDescriptor desc, byte[][] splitKeys) 

void createTableAsync(HTableDescriptor desc, byte[][] splitKeys) 

 

第一個函數相對簡單,就是建立一個表,這個表沒有任何region。後三個函數是建立表的時候幫你分配好指定數量的region(提早分配region的好處,瞭解HBase的人都清楚,爲了減小Split,這樣能節省很多時間)

 

第二個函數是使用者指定表的「起始行鍵」、「末尾行鍵」和region的數量,這樣系統自動給你劃分region。根據的region數,來均分全部的行鍵。這個方法的問題是若是你的表的行鍵不是連續的,那樣的話就致使有些region的行鍵不會用到,有些region是全滿的。

 

因此HBase很人性的給了第三種和第四種方法。這兩個函數是用戶須要本身region的劃分。這個函數的參數splitKeys是一個二維字節數據,行的最大數表示region劃分數+1,列就表示region和region之間的行鍵。

 

byte[][] regions = new byte[][] {  

  Bytes.toBytes("A"), 

  Bytes.toBytes("D"), 

  Bytes.toBytes("G"), 

  Bytes.toBytes("K"), 

  Bytes.toBytes("O"), 

  Bytes.toBytes("T") 

}; 

 

就表示有7個region(6+1),具體region表示的行鍵爲:

[java] view plaincopyprint?

[1] start key: , end key: A 

[2] start key: A, end key: D 

[3] start key: D, end key: G 

[4] start key: G, end key: K 

[5] start key: K, end key: O 

[6] start key: O, end key: T 

[7] start key: T, end key:

 

刪除表

刪除表也是經過HBaseAdmin來操做,刪除表以前首先要disable表。這是一個很是耗時的操做,因此不建議頻繁刪除表。

disableTable和deleteTable分別用來disable和delete表。

admin = new HBaseAdmin(HbaseConf);                  

admin.disableTable(tableName);            

admin.deleteTable(tableName);

 

查詢數據

查詢分爲單條隨機查詢和批量查詢。

單條查詢是經過rowkey在table中查詢某一行的數據。HTable提供了get方法來完成單條查詢。

批量查詢是經過制定一段rowkey的範圍來查詢。HTable提供了個getScanner方法來完成批量查詢。

public Result get(final Get get)

public ResultScanner getScanner(final Scan scan)

Get對象包含了一個Get查詢須要的信息。它的構造方法有兩種:

  public Get(byte [] row)

  public Get(byte [] row, RowLock rowLock)

Rowlock是爲了保證讀寫的原子性,你能夠傳遞一個已經存在Rowlock,不然HBase會自動生成一個新的rowlock。

Scan對象提供了默認構造函數,通常使用默認構造函數。

 

Get/Scan的經常使用方法有:

addFamily/addColumn:指定須要的family或者column,若是沒有調用任何addFamily或者Column,會返回全部的columns.

setMaxVersions:指定最大的版本個數。若是不帶任何參數調用setMaxVersions,表示取全部的版本。若是不掉用setMaxVersions,只會取到最新的版本。

setTimeRange:指定最大的時間戳和最小的時間戳,只有在此範圍內的cell才能被獲取。

setTimeStamp:指定時間戳。

setFilter:指定Filter來過濾掉不須要的信息

 

Scan特有的方法:

setStartRow:指定開始的行。若是不調用,則從表頭開始。

setStopRow:指定結束的行(不含此行)。

setBatch:指定最多返回的Cell數目。用於防止一行中有過多的數據,致使OutofMemory錯誤。

ResultScanner是Result的一個容器,每次調用ResultScanner的next方法,會返回Result.

public Result next() throws IOException;

public Result [] next(int nbRows) throws IOException;

 

Result表明是一行的數據。經常使用方法有:

getRow:返回rowkey

raw:返回全部的key value數組。

getValue:按照column來獲取cell的值

 

Example:

table = new HTable(conf, tableName);

table.setAutoFlush(false, false);

table.setWriteBufferSize(writeBufferSize);

Scan scan = new Scan();

scan.setTimeRange(start, end);

scan.addFamily(COLUMN_FAMILY);

scan.setMaxVersions();

ResultScanner ss = table.getScanner(scan);

ResultScanner ss = table.getScanner(s);

for(Result r:ss){

    System.out.println(new String(r.getRow()));

        for(KeyValue kv:r.raw()){

            System.out.println(new String(kv.getQualifier()));

            System.out.println(new String(kv.getValue()));

}

 } 

 

插入數據

HTable經過put方法來插入數據。 

public void put(final Put put) throws IOException

public void put(final List puts) throws IOException

能夠傳遞單個批Put對象或者List put對象來分別實現單條插入和批量插入。

Put提供了3種構造方式:

public Put(byte [] row)

public Put(byte [] row, RowLock rowLock)

public Put(Put putToCopy) 

 

Put經常使用的方法有:

add:增長一個Cell

setTimeStamp:指定全部cell默認的timestamp,若是一個Cell沒有指定timestamp,就會用到這個值。若是沒有調用,HBase會將當前時間做爲未指定timestamp的cell的timestamp.

setWriteToWAL: WAL是Write Ahead Log的縮寫,指的是HBase在插入操做前是否寫Log。默認是打開,關掉會提升性能,可是若是系統出現故障(負責插入的Region Server掛掉),數據可能會丟失。

另外HTable也有兩個方法也會影響插入的性能

setAutoFlash: AutoFlush指的是在每次調用HBase的Put操做,是否提交到HBase Server。默認是true,每次會提交。若是此時是單條插入,就會有更多的IO,從而下降性能.

setWriteBufferSize: Write Buffer Size在AutoFlush爲false的時候起做用,默認是2MB,也就是當插入數據超過2MB,就會自動提交到Server

 

Example:

HTable table = new HTable(hbaseConfig, tableName);

table.setAutoFlush(autoFlush);

List lp = new ArrayList();

int count = 10000;

byte[] buffer = new byte[1024];

Random r = new Random();

for (int i = 1; i <= count; ++i) {

       Put p = new Put(String.format(「row%09d」,i).getBytes());

       r.nextBytes(buffer);

       p.add(「f1″.getBytes(), null, buffer);

       p.add(「f2″.getBytes(), null, buffer);

       p.add(「f3″.getBytes(), null, buffer);

       p.add(「f4″.getBytes(), null, buffer);

       p.setWriteToWAL(wal);

       lp.add(p);

       if(i%1000==0){

           table.put(lp);

           lp.clear();

       }

    }

 

 

刪除數據

HTable 經過delete方法來刪除數據。

  public void delete(final Delete delete) 

 

Delete構造方法有:

public Delete(byte [] row)

public Delete(byte [] row, long timestamp, RowLock rowLock)

public Delete(final Delete d)

Delete經常使用方法有

deleteFamily/deleteColumns:指定要刪除的family或者column的數據。若是不調用任何這樣的方法,將會刪除整行。

注意:若是某個Cell的timestamp高於當前時間,這個Cell將不會被刪除,仍然能夠查出來。

 

Example:

HTable table = new HTable(hbaseConfig, 「mytest」);

Delete d = new Delete(「row1″.getBytes());

table.delete(d) 

 

 

切分表

HBaseAdmin提供split方法來將table 進行split.

public void split(final String tableNameOrRegionName)

 

若是提供的tableName,那麼會將table全部region進行split ;若是提供的region Name,那麼只會split這個region.

因爲split是一個異步操做,咱們並不能確切的控制region的個數。

 

Example:

          

public void split(String tableName,int number,int timeout) throws Exception {

    Configuration HBASE_CONFIG = new Configuration();

    HBASE_CONFIG.set(「hbase.zookeeper.quorum」, GlobalConf.ZOOKEEPER_QUORUM);

    HBASE_CONFIG.set(「hbase.zookeeper.property.clientPort」, GlobalConf.ZOOKEEPER_PORT);

    HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

    HBaseAdmin hAdmin = new HBaseAdmin(cfg);

    HTable hTable = new HTable(cfg,tableName);

    int oldsize = 0;

    t =  System.currentTimeMillis();

    while(true){

       int size = hTable.getRegionsInfo().size();

       logger.info(「the region number=」+size);

       if(size>=number ) break;

       if(size!=oldsize){

           hAdmin.split(hTable.getTableName());

           oldsize = size;

       }       else if(System.currentTimeMillis()-t>timeout){

           break;

       }

       Thread.sleep(1000*10);

    }

}

 

 

 學習中的一些錯誤

用eclipse測試hbase時報錯:

13/11/19 16:14:06 INFO ipc.HBaseRPC: Problem connecting to server: zzz.yyy.sqa.cm4/202.106.199.38:36020

 

緣由:

須要設置host: zzz.yyy.sqa.cm4 ,在開發機的集羣和我本身電腦的集羣該ip不同,一個是外網ip,一個是內網ip。須要手動設置host

相關文章
相關標籤/搜索