Hbase的資料寫入

2021-07-22 17:01:38 字數 2367 閱讀 7075

建立多個htable

客戶端用於寫操作,提高寫資料的吞吐量,乙個例子:

static

final

configuration conf = hbaseconfiguration.create();

static

final

string table_log_name = 「user_log」;

wtablelog =

newhtable[tablen];

for(

inti = 0; i < tablen; i++)

通過呼叫htable.setautoflush(false)

方法可以將

htable

寫客戶端的自動

flush

關閉,這樣可以批量寫入資料到

hbase

,而不是有一條

put就執行一次更新,只有當

put填滿客戶端寫快取時,才實際向

hbase

服務端發起寫請求。預設情況下

auto flush

是開啟的。

通過呼叫htable.setwritebuffersize(writebuffersize)

方法可以設定

htable

客戶端的寫

buffer

大小,如果新設定的

buffer

小於當前寫

buffer

中的資料時,

buffer

將會被flush

到服務端。其中,

writebuffersize

的單位是

byte

位元組數,可以根據實際寫入資料量的多少來設定該值。

在hbae

中,客戶端向集群中的

regionserver

提交資料時(

put/delete

操作),首先會先寫

wal(

write ahead log

)日誌(即

hlog

,乙個regionserver

上的所有

region

共享乙個

hlog

),只有當

wal日誌寫成功後,再接著寫

memstore

,然後客戶端被通知提交資料成功;如果寫

wal日誌失敗,客戶端則被通知提交失敗。這樣做的好處是可以做到

regionserver

宕機後的資料恢復。

因此,對於相對不太重要的資料,可以在put/delete

操作時,通過呼叫

put.setwritetowal(false)

或delete.setwritetowal(false)

函式,放棄寫

wal日誌,從而提高資料寫入的效能。

值得注意的是:謹慎選擇關閉wal

日誌,因為這樣的話,一旦

regionserver

宕機,put/delete

的資料將會無法根據

wal日誌進行恢復。

通過呼叫htable.put(put)

方法可以將乙個指定的

row key

記錄寫入

hbase

,同樣hbase

提供了另乙個方法:通過呼叫

htable.put(list)

方法可以將指定的

row key

列表,批量寫入多行記錄,這樣做的好處是批量執行,只需要一次網路

i/o開銷,這對於對資料實時性要求高,網路傳輸

rtt高的情景下可能帶來明顯的效能提公升。

在客戶端開啟多個htable

寫執行緒,每個寫執行緒負責乙個

htable

物件的flush

操作,這樣結合定時

flush

和寫buffer

(writebuffersize

),可以既保證在資料量小的時候,資料可以在較短時間內被

flush(如1

秒內),同時又保證在資料量大的時候,寫

buffer

一滿就及時進行

flush

。下面給個具體的例子:

for(int

i = 0; i < threadn; i++)

catch

(interruptedexception e)

synchronized

(wtablelog[i])

catch

(ioexception e) }}

}};th.setdaemon(

true

);th.start();

}

hbase 二進位制資料寫入 Hbase的儲存

hbase中的每張表都通過行鍵按照一定的範圍被分割成多個子表 hregion 預設乙個hregion超過256m就要被分割成兩個,由hregionserver管理,管理哪些hregion由hmaster分配。hregionserver訪問乙個子表時,會建立乙個hregion物件,然後對錶的每個列族 ...

HBase 寫入資料的乙個坑

hbase是沒有資料型別的,全部以位元組陣列形式儲存。int value 0 int 型別會被轉換為 ascii 碼後存入位元組陣列 48 實際儲存的是 48 put.addcolumn family,bytes.tobytes value bytes.tobytes value 先轉換為字串 0 ...

HBase寫入優化 write buff

前兩天在觀察kafka消費資料的時候,發現hbase偶爾會報乙個org.apache.hadoop.hbase.regiontoobusyexception org.apache.hadoop.hbase.regiontoobusyexception這種錯誤出來,從描述上看,是hbase寫入太過頻繁...