hbase java api程式設計

2021-07-02 01:33:29 字數 4668 閱讀 7441

一、hbase配置物件

hbaseconfiguration是每乙個hbase client都會使用到的物件,它代表的是hbase配置資訊

構造方法:

public hbaseconfiguration()

public hbaseconfiguration(final configuration c)

預設的構造方式會嘗試從hbase-default.xml和hbase-site.xml中讀取配置。如果classpath沒有這兩個檔案,就需要你自己設定配置。

eg.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);

二、建立表

建立表是通過hbaseadmin物件來操作的。hbaseadmin負責表的meta資訊處理。

hbaseadmin提供了createtable這個方法:

public void createtable(htabledescriptor desc)

htabledescriptor 代表的是表的schema, 提供的方法中比較有用的有

setmaxfilesize,指定最大的region size

setmemstoreflushsize 指定memstore flush到hdfs上的檔案大小

三、增加列族

增加列家族是通過htabledescriptor物件來操作的。

public void addfamily(final hcolumndescriptor family)

hcolumndescriptor 代表的是column的schema,提供的方法比較常用的有

settimetolive:指定最大的ttl,單位是ms,過期資料會被自動刪除。

setinmemory:指定是否放在記憶體中,對小表有用,可用於提高效率。預設關閉

setbloomfilter:指定是否使用bloomfilter,可提高隨機查詢效率。預設關閉

setcompressiontype:設定資料壓縮型別。預設無壓縮。

setmaxversions:指定資料最大儲存的版本個數。預設為3。

四、刪除表

刪除表是通過hbaseadmin來操作,刪除表之前首先要disable表。這是乙個非常耗時的操作,所以不建議頻繁刪除表。

disabletable和deletetable分別用來disable和delete表。

eg.hbaseadmin hadmin = new hbaseadmin(hbaseconfig);

if (hadmin.tableexists(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的值

eg.scan s = new scan();

s.setmaxversions();

resultscanner ss = table.getscanner(s);

for(result r:ss)

}六、插入資料

htable通過put方法來插入資料。 

public void put(final put put) throws ioexception

public void put(final listputs) 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

七、刪除資料

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將不會被刪除,仍然可以查出來。

eg.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的個數。

eg.public void split(string tablename,int number,int timeout) throws exception       

else if(system.currenttimemillis()-t>timeout)

thread.sleep(1000*10);}}

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...

LINUX程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...