HBase相關(guān)內(nèi)容

2018-09-27 14:32 更新

批量加載

如果可以,請(qǐng)使用批量加載工具。請(qǐng)參閱HBase批量加載。否則,請(qǐng)注意以下內(nèi)容。

表創(chuàng)建:預(yù)創(chuàng)建區(qū)域

默認(rèn)情況下,HBase中的表最初是使用一個(gè)區(qū)域創(chuàng)建的。對(duì)于批量導(dǎo)入,這意味著所有客戶端都將寫入同一區(qū)域,直到它足夠大,可以拆分并在集群中分布。加速批量導(dǎo)入過程的一個(gè)有用模式是預(yù)先創(chuàng)建空白區(qū)域。在這方面要保守一點(diǎn),因?yàn)樘嗟膮^(qū)域?qū)嶋H上會(huì)降低性能。

使用HBase API預(yù)創(chuàng)建拆分有兩種不同的方法。第一種方法是依靠默認(rèn)Admin策略(在Bytes.split中實(shí)現(xiàn))......

byte[] startKey = ...;      // your lowest key
byte[] endKey = ...;        // your highest key
int numberOfRegions = ...;  // # of regions to create
admin.createTable(table, startKey, endKey, numberOfRegions);

而使用HBase API的另一種方法是自己定義拆分...

byte[][] splits = ...;   // create your own splits
admin.createTable(table, splits);

使用HBase Shell可以通過指定拆分選項(xiàng)來創(chuàng)建表,從而實(shí)現(xiàn)類似的效果。

# create table with specific split points
hbase>create 't1','f1',SPLITS => ['\x10\x00', '\x20\x00', '\x30\x00', '\x40\x00']

# create table with four regions based on random bytes keys
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }

# create table with five regions based on hex keys
create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }

有關(guān)理解鍵空間和預(yù)創(chuàng)建區(qū)域的相關(guān)問題,請(qǐng)參閱RowKeys和區(qū)域分割之間的關(guān)系。有關(guān)手動(dòng)預(yù)分割區(qū)域的討論,請(qǐng)參閱手動(dòng)拆分區(qū)域決策。有關(guān)使用HBase shell預(yù)拆分表的詳細(xì)信息,請(qǐng)參閱使用HBase shell預(yù)分割表。

表創(chuàng)建:延遲日志刷新

使用Write Ahead Log(WAL)的Puts的默認(rèn)行為是將WAL立即寫入編輯。如果使用延遲日志刷新,則WAL編輯將保留在內(nèi)存中直到刷新周期。好處是聚合和異步WAL- 寫入,但潛在的缺點(diǎn)是,如果RegionServer發(fā)生故障,那么尚未刷新的編輯將丟失。然而,這比完全不使用具有Puts的WAL更安全。

可以通過HTableDescriptor在表上配置延遲日志刷新。hbase.regionserver.optionallogflushinterval的默認(rèn)值為1000毫秒。

HBase客戶端:關(guān)閉WAL

經(jīng)常請(qǐng)求禁用WAL以提高Puts的性能。這僅適用于批量加載,因?yàn)樗鼤?huì)在區(qū)域服務(wù)器崩潰時(shí)通過刪除WAL的保護(hù)來使您的數(shù)據(jù)處于危險(xiǎn)之中。在發(fā)生崩潰時(shí)可以重新運(yùn)行批量加載,幾乎沒有數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

注意:如果為批量加載以外的任何操作禁用WAL,則數(shù)據(jù)存在風(fēng)險(xiǎn)。

通常,最好使用WAL進(jìn)行Puts,而使用批量加載技術(shù)時(shí),加載吞吐量是一個(gè)問題。對(duì)于正常的Puts,您不太可能看到性能的改善會(huì)超過風(fēng)險(xiǎn)。要禁用WAL,請(qǐng)參閱禁用WAL。

HBase客戶端:通過RegionServer對(duì)Puts進(jìn)行分組

除了使用writeBuffer之外,通過RegionServer分組的Put還可以減少每次writeBuffer刷新時(shí)客戶端RPC調(diào)用的數(shù)量。目前在MASTER上有一個(gè)實(shí)用程序的HTableUtil,可以這樣做,但是對(duì)于那些仍然在0.90.x或者更早的版本上的應(yīng)用程序,您可以復(fù)制它,或者實(shí)現(xiàn)您自己的版本。

MapReduce:跳過Reducer

從MR作業(yè)(例如,使用TableOutputFormat)向HBase表寫入大量數(shù)據(jù)時(shí),特別是從Mapper發(fā)出Puts的地方時(shí),跳過Reducer步驟。當(dāng)使用Reducer步驟時(shí),來自Mapper的所有輸出(Puts)將被假脫機(jī)(spooled)到磁盤,然后排序/混洗到其他很可能是非節(jié)點(diǎn)的Reducers。直接寫入HBase效率更高。

對(duì)于將HBase用作源和接收器的摘要作業(yè),則寫入將來自Reducer步驟(例如,匯總值然后寫出結(jié)果)。這是與上述情況不同的處理問題。

反模式:一個(gè)熱點(diǎn)區(qū)域

如果您的所有數(shù)據(jù)一次寫入一個(gè)區(qū)域,則重新閱讀有關(guān)處理時(shí)間序列數(shù)據(jù)的部分。

此外,如果您正在預(yù)分割區(qū)域,并且即使您的密鑰沒有單調(diào)增加,您的所有數(shù)據(jù)仍然在單個(gè)區(qū)域中清盤,請(qǐng)確認(rèn)您的密鑰空間實(shí)際上與分離策略一起使用。區(qū)域可能出現(xiàn)“分裂”的原因有多種,但不適用于您的數(shù)據(jù)。由于HBase客戶端直接與RegionServers通信,因此可以通過RegionLocator.getRegionLocation獲取。

請(qǐng)參閱上文的“表創(chuàng)建:預(yù)創(chuàng)建區(qū)域”以及HBase配置。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)