hbase學習筆記5 基礎客戶端API

2021-09-01 19:25:06 字數 4647 閱讀 8147

一、環境

二、基礎客戶端api

1、bytes類

hbase中所有的值都是以位元組陣列的形式存在的,所以在使用客戶端api和hbase互動的過程中難免會經常的要操作位元組陣列,這裡hbase提供了乙個工具類,bytes類。其中有很多的靜態方法可以方便的將各種型別的值轉換成位元組陣列,同時也可以將位元組陣列轉換成對應的型別。

2、keyvalue類

keyvalue提供了乙個hbase中鍵值對的抽象,我們都知道hbase是面向列的資料庫,其中的資料是以鍵值對k-v的形式存在,keyvalue就是乙個完全的抽象。keyvalue封裝了乙個單元資料的完整座標(key):主鍵(row key)、簇(family)、列(qualifier),版本(timestamp)和值(value)

3、put方法

hbase提供乙個put類,用於封裝插入的邏輯。插入時必須制定主鍵(row key)的值,所以構造方法中必須提供主鍵值。

put(byte row)

put(byte row, rowlock)

...有了

put物件以後,就可以在物件中新增插入的資訊

put add(byte family, byte qualifier, byte value);

put add(byte family, byte qualifier, long ts, byte value); 

為了提高執行效率,插入的操作可以設定乙個緩衝區,快取要插入的資訊,超過閥值後才提交,減少和

server

互動的次數。

緩衝區:緩衝區預設是關閉的,要呼叫table.setautoflush(true)顯示的開啟。並可以通過table.setwritebuffersize(size)設定緩衝區的大小。除了這種方式以外,配置檔案中提供靜態的配置項可以配置緩衝區的大小。

開啟緩衝區以後需要重新整理才能讓請求提交到server。

顯式的提交(explicit flush):呼叫table.flushcommits()方法可以顯式的將緩衝區裡的請求提交到server

隱式的提交(implicit flush) :每一次呼叫table.put()或者table.setwritebuffersize()方法都會觸發乙個檢查當前的緩衝區是否超過閥值,如果超過了就會執行一次隱式的提交。另外,呼叫table.close()方法會強制將緩衝區內的請求提交。

批量提交(list of puts):table提供批量提交的功能,可以一次提交多個插入請求

void put(listputs)

值得注意的是,這裡實際提交的順序是一定的,但是在伺服器被執行的順序卻是不可預知的,因為伺服器會根據負載等情況對請求的執行作優化,所以如果提交的請求對順序有其他的要求應該作更加精細的提交。

如果在批量提交的過程中有某些請求出現了錯誤(提交的資料不符合表定義、伺服器故障),不會影響其他正常的請求,它們將被正常的提交並寫入資料庫。那些出現了錯誤的請求將導致客戶端丟擲異常,且沒有成功執行的請求會被重新放進客戶端的緩衝區(write buffer)裡,等待客戶端作進一步的處理。

cas(compare and set)插入(這是一種無鎖的安全性保證):

cas插入也是被支援的,客戶端可以在插入前作比較確認目標記錄沒有被其他的請求修改再執行插入。這樣的執行方式可以保證當你作read-bussiness-write的時候不會因為read之後有其他並行執行緒修改資料而導致你的業務出現錯誤。這是一種強大的執行方式,在並行、分布式的業務中。

4、get方法

hbase提供乙個get方法來獲取到指定主鍵的值。

get(byte row)

get(byte row, rowlock rowlock)

由於方法功能定義的限制,所以構造方法裡都要求指定乙個主鍵。查詢的過程中,還可以附加其他的一些條件如簇名(

family

),列名,版本等。

result get(get get)

htable

的get

方法會返回乙個

result

類,封裝了獲取的值的全部資訊。

result

提供了三種方法來遍歷資料

byte getvalue(byte family, byte qualifier)

keyvalue raw()

listlist()

即,可以通過指定簇名和列名來得到指定的值,或者把整個返回結果轉換成為陣列或

list

來遍歷。不管是哪一種方法,都可以獲取到全部的資料,可以根據需求靈活運用。

批量提交(

list of gets

):同put

一樣,get

也有批量提交的方法

result getgets>

不同於put

的是,一旦集合中有乙個無效的

get請求將返回乙個

exception

,而所有的

get請求都將失效而不會返回任何資料。

delete方法

hbase提供delete方法來刪除指定的資料

類似於get方法,delete方法需要主鍵,而其他的條件是任選的,但是不同的條件將帶來不同的執行結果。

delete deletefamily(byte family)

delete deletecolumns(byte family, byte qualifier)

delete deletecolumn(byte family, byte qualifier)

沒有任意任選條件被呼叫時,將刪除所有具有row key的資料

當指定的是單一的column時,對應column的最近乙個版本的資料將被刪除

當指定的是columns時,對應的column的所有值將被刪除

當指定的是family時,對應的整個family的所有值將被刪除

delete也有類似的批量操作的方法,同樣的,執行順序是不可預知的。

delete還有類似的cas的操作,值得注意的是,compare

和delete的必須是同一行資料。

batchoperations(批量操作)

這裡的批量操作和上文介紹的批量操作很類似,但是這裡是最泛化的批量操作

void batch(listactions)

可以看出,不論是put,還是get都是row的子類。

值得注意的是,在批量操作中,客戶端緩衝區將是不會被使用的。

行鎖(row lock)

在上文的api中,都有可選的rowlock引數,這是顯式的行鎖,當業務需要強一致性的時候可以考慮使用,顯式的行鎖可以保證乙個插入請求成為乙個互斥的獨佔的請求。當一行資料被鎖住的時候,其他的請求都將被阻塞,直到行鎖被釋放或者阻塞超(這個超時時間可以再配置檔案中配置)。hbase其實也提供有乙個隱式的行鎖,如果請求沒有提供顯式的行鎖,hbase將啟用隱式的行鎖,保證插入操作的原子性。

另外,讀取資料是不需要鎖的,所以寫時的鎖不會影響讀的效能。

scan方法

除了get方法外,hbase提供查詢功能更加強大的scan方法。get是根據指定的row key來查詢對應的資料,而scan方法則是根據一系列的條件來查詢。

scan()

scan(byte startkey, filter filter)

scan(byte startkey, byte endkey)

scan(byte startkey)

查詢的範圍仍然是根據主鍵來確定, 不帶引數的scan表示將查詢整個表,而指定了start和end的scan則只掃瞄開始和結束範圍內的資料。filter引數則可以定義更加複雜的查詢條件,滿足查詢需求,這部分以後再討論。

scan中也提供像get一樣的簡單的通過指定簇名和列名等條件來查詢,但是更多的用法是定義自己的filter來查詢。所以這裡不對scan的簡單操作作過多糾纏。

scan的返回結果為resultscaner,客戶端可以把resultscaner簡單的看作乙個result的集合,但是實際上,resultscaner比result要複雜很多。由於scan是大規模的查詢,所以其返回的結果可以也是乙個很大的資料集,所以如果讓這樣大的乙個資料集一次性返回給客戶端,將給記憶體和網路造成很大的負擔,所以resultscaner作為乙個返回結果,實際上持有乙個rpc連線,使客戶端在處理結果集的時候可以一批一批的處理,而不是一次性將所有返回結果接受。

result next()

result next(int nbrows)

void clos()

用於要分批次的處理資料,resultscaner實際上要持有server的資源,所以用完以後要關閉以釋放資源。

hbase

提供了兩個機制來條件resultscaner的效能。首先是scaner caching快取(可以在配置檔案中配置),這裡的快取定義了一次rpc返回客戶端的行數。定義乙個更大的快取數無疑可以提高客戶端遍歷的效能,但是也有壞處:這將加大客戶端記憶體的壓力,並且每一次rpc呼叫花的時間會更長,因為要使用網路來傳輸更多的資料。scaner有乙個超時機制,一次rpc用的時間超過了這個閥值的時候,客戶端就會丟擲乙個異常。所以應該根據實際情況來定義超時閥值和快取數。另外乙個機制叫scaner batch批次, 快取是從行的角度來定義一次rpc返回的資料,但是如果返回的結果中包含有具有很多列的行,同樣會對記憶體和網路造成壓力,batch就從列的角度來定義,batch定義的是一次性最多傳輸的列的數量。

根據情況合理的設定緩衝和batch可以使處理查詢結果變得高效。

Hbase客戶端優化

scan caching scanner一次快取多少資料來scan 從服務端一次抓多少資料回來scan 預設值是 1,一次只取一條。scan attribute selection scan時建議指定需要的column family,減少通訊量,否則scan操作缺省會返回整個row的所有資料 所有c...

iOS 客戶端學習 筆記

是否按照整頁來滾動檢視 scrollview pagingenabled yes 是否開啟滾動效果 scrollview scrollenabled yes 是否可以邊緣彈動效果 scrollview bounces yes 是否可以橫向彈動效果 scrollview alwaysbouncehor...

ftp客戶端 學習筆記

檔案傳輸協議 ftp 作為網路共享檔案的傳輸協議,在網路應用軟體中具有廣泛的應用。ftp的目標是提高檔案的共享性和可靠高效地傳送資料。在傳輸檔案時,ftp 客戶端程式先與伺服器建立連線,然後向伺服器傳送命令。伺服器收到命令後給予響應,並執行命令。ftp 協議與作業系統無關,任何作業系統上的程式只要符...