建立多個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寫入太過頻繁...