HBase總結(4) 資料掃瞄與Scan物件

2021-07-10 07:25:10 字數 3589 閱讀 7118

一、介紹

put、delete與get物件都是row的子類,從該繼承關係中我們就可以了解到get、delete與pu物件本身就只能進行單行的操作,hbase客戶端還提供了一套能夠進行全表掃瞄的api,方便使用者能夠快速對整張表進行掃瞄,以獲取想要的結果---scan

二、流程介紹

全表掃瞄是一種不需要行鍵值的操作,因此初始化時不需要指定行鍵值,因此就產生了不同的使用方法

1、不進行scan物件建立的全表掃瞄

在該過程中,htable物件會在掃瞄請求傳送前隱式的建立乙個scan物件,然後傳遞給hbase伺服器集群。

public void scanwithoutinit(string tablename,string family)

//建立表連線

htable table=new htable(conf, tablename);

//獲取全表掃瞄

resultscanner resultscanner=table.getscanner(bytes.tobytes(family));

//對結果進行顯示

iteratorresults=resultscanner.iterator();

while(results.hasnext())

}} catch (exception e)

}

getscanner()方法時,如果不輸入指定的scan物件,則需要輸入相應的列簇或者列。因此在不進行scan物件建立的掃瞄中,需要明確指出列簇或者列,如果需要掃瞄多個列簇時,該方法就無法起到作用了。

2、進行初始化的全表掃瞄

初始化乙個scan物件,然後對該物件進行相應的配置過,通過 getscanner(scan scan) 函式進行全表掃瞄。

public void scanwithinit(string tablename)

//建立掃瞄類

scan scan=new scan();

scan.setstartrow(bytes.tobytes("row-1"));

scan.setstoprow(bytes.tobytes("row-9"));

//建立表連線

htable table=new htable(conf, tablename);

resultscanner rs=table.getscanner(scan);

result result;

while((result=rs.next())!=null)

}rs.close();

table.close();

} catch (exception e)

}

在上段**中,使用了setstartrow() 與 setstoprow() 兩個函式進行調優。scan有多個函式可以進行對全表掃瞄做出相應的規範。

3、資料遍歷與顯示scannerresult

通過上述兩種方法可以傳送對一張表是遍歷請求,當傳送後,伺服器會相應的啟動全表掃面程式,從而準備向客戶端返回相應的資料。因此根據客戶端的遍歷需要對資料盡心請求,然後將請求的結果進行返回,客戶端拿到後進行展示

(1)next()的單行返回資料的方法

resultscanner rs=table.getscanner(bytes.tobytes(family));

//進項單行獲取演示

result result=null;

while((result=rs.next())!=null)

}rs.close();

next()方法會預設想客戶端請求傳送一行資料請求,剛伺服器端的scan程式接收到請求後會將經需要返回的資料封裝成乙個result物件返回給客戶端,因此客戶端可以通過result物件去接受該行資料。接收到的資料則跟get中的result使用方法是相同的。

(2)next(int n)的多行返回資料的方法

next(int n):該函式會向伺服器傳送多個請求,以返回多條資料請求。

//一次獲取多個結果(行資料)進行展示

rs=table.getscanner(bytes.tobytes(family));

result results=null;

while((results=rs.next(2))!=null)}}

rs.close();

next(int n)函式返回的是乙個result陣列。使用者接受到資料後可以進行相應的操作。

(3)迭代器遍歷

//進行迭代的方式進行輸出

rs=table.getscanner(bytes.tobytes(family));

iteratorresultiterator=rs.iterator();

while(resultiterator.hasnext())

}//關閉表

rs.close();

(4)注意點

因為當使用者傳送乙個scan全表掃瞄後,region伺服器會為全表掃瞄建立掃瞄資源,因此長時間啟用全表掃瞄的話會占用region伺服器的大量資源,所以在要求在使用完scanner掃瞄器後盡快釋放掉資源。

rs.close() 會告知服務其掃瞄器租約已經結束,伺服器就會釋相應的全域性掃瞄的資源。

三、scan物件

(1)setstartrow() / setstoprow

設定掃瞄的開始行與結束行,通過這兩個可以直接確scan在掃瞄的範圍,通過縮小範圍可以減少掃瞄到時間,從而提高掃瞄的效率

(2)addfamily() / addcolumn()

通過這兩個函式,可以在列或者列簇上的掃瞄位置。hbase是面向lie出書的資料庫,而同乙個列簇的資料全部存放在同乙個位置檔案中。因此如果可以確定掃瞄那個一列簇時,可以減少掃瞄的範圍,從而縮短掃瞄的時間。而在確定到某乙個列時也會因為hbase的面向列儲存使得其效率提高。

(3)setmaxversion() / setmaxversion(int version)

設定返回的版本數量,預設為返回最新的資料。第乙個函式則會返回所有的版本資料,第二個函式可以設定返回的版本數量

(4)settimestamp(long max)

返回該時間戳的資料

(5)settimerange(long min,long max)

設定返回的時間戳的範圍,只有版本值在該範圍之內的資料才會被返回到客戶端

(6)setfilter(filter f)

設定過濾器,有時候掃瞄全表返回的數量過大時,可以通過過濾器將不符合的資料進行過濾,這樣可以減少從伺服器到客戶端的資料傳送,挺高掃瞄效率。

(7)setcacheblocks(boole open)

在進行全表掃瞄過程中,伺服器端提供了乙個快取區,該快取區可以將指定的資料量全部放入到記憶體中,這樣可以提高讀取效率。快取區的開啟也可以通過htable客戶端進行開啟。在開發後使用者可以通過 setcache(int n)的方式設定每次快取的數量為多少。通過調整該函式以提高讀取的效率。

四、總結

scan的全表掃瞄區別於其他三個操作,雖然獲取資料與get獲取的資料是相同的,其與get也具有形似的屬性,可以通過修改這些屬性去對資料獲取進行調優,從而使得提高資料獲取的效率。

HBase掃瞄表資料

1 通過hbase shell的scan命令可以檢視表中的所有資料,命令如下 scan tablename 檢視emp中所有資料 scan emp 2 通過python thrift api掃瞄表資料,如下 coding utf 8 from thrift.transport.tsocket imp...

HBase資料恢復 (總結14)

每個hregionserver中都會有乙個hlog物件,hlog是乙個實現write ahead log的類,每次使用者操作寫入memstore的同時,也會寫乙份資料到hlog檔案,hlog檔案定期會滾動出新,並刪除舊的檔案 已持久化到storefile中的資料 當hregionserver意外終止...

HBase資料匯入工具總結

本文對hbase常用的資料匯入工具進行介紹,並結合雲hbase常見的匯入場景,給出建議的遷移工具和參考資料。hbase提供了幾種資料遷移工具,其中基於api呼叫的有copytable,export import。基於寫hdfs的有distcp,snapshot。這裡要說明的是,本文作為一般性的介紹,...