HBase性能优化方法总结(二):写表操作
2. 寫表操作
2.1 多HTable并發(fā)寫
創(chuàng)建多個(gè)HTable客戶端用于寫操作,提高寫數(shù)據(jù)的吞吐量,一個(gè)例子:
?
static?final?Configuration conf = HBaseConfiguration.create();
static?final?String table_log_name = “user_log”;
wTableLog = new?HTable[tableN];
for?(int?i = 0; i < tableN; i++) {
????wTableLog[i] = new?HTable(conf, table_log_name);
????wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB
????wTableLog[i].setAutoFlush(false);
}
?
2.2 HTable參數(shù)設(shè)置
2.2.1 Auto Flush
通過(guò)調(diào)用HTable.setAutoFlush(false)方法可以將HTable寫客戶端的自動(dòng)flush關(guān)閉,這樣可以批量寫入數(shù)據(jù)到HBase,而不是有一條put就執(zhí)行一次更新,只有當(dāng)put填滿客戶端寫緩存時(shí),才實(shí)際向HBase服務(wù)端發(fā)起寫請(qǐng)求。默認(rèn)情況下auto flush是開啟的。
2.2.2 Write Buffer
通過(guò)調(diào)用HTable.setWriteBufferSize(writeBufferSize)方法可以設(shè)置HTable客戶端的寫buffer大小,如果新設(shè)置的buffer小于當(dāng)前寫buffer中的數(shù)據(jù)時(shí),buffer將會(huì)被flush到服務(wù)端。其中,writeBufferSize的單位是byte字節(jié)數(shù),可以根據(jù)實(shí)際寫入數(shù)據(jù)量的多少來(lái)設(shè)置該值。
2.2.3 WAL Flag
在HBae中,客戶端向集群中的RegionServer提交數(shù)據(jù)時(shí)(Put/Delete操作),首先會(huì)先寫WAL(Write Ahead Log)日志(即HLog,一個(gè)RegionServer上的所有Region共享一個(gè)HLog),只有當(dāng)WAL日志寫成功后,再接著寫MemStore,然后客戶端被通知提交數(shù)據(jù)成功;如果寫WAL日志失敗,客戶端則被通知提交失敗。這樣做的好處是可以做到RegionServer宕機(jī)后的數(shù)據(jù)恢復(fù)。
因此,對(duì)于相對(duì)不太重要的數(shù)據(jù),可以在Put/Delete操作時(shí),通過(guò)調(diào)用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函數(shù),放棄寫WAL日志,從而提高數(shù)據(jù)寫入的性能。
值得注意的是:謹(jǐn)慎選擇關(guān)閉WAL日志,因?yàn)檫@樣的話,一旦RegionServer宕機(jī),Put/Delete的數(shù)據(jù)將會(huì)無(wú)法根據(jù)WAL日志進(jìn)行恢復(fù)。
2.3 批量寫
通過(guò)調(diào)用HTable.put(Put)方法可以將一個(gè)指定的row key記錄寫入HBase,同樣HBase提供了另一個(gè)方法:通過(guò)調(diào)用HTable.put(List<Put>)方法可以將指定的row key列表,批量寫入多行記錄,這樣做的好處是批量執(zhí)行,只需要一次網(wǎng)絡(luò)I/O開銷,這對(duì)于對(duì)數(shù)據(jù)實(shí)時(shí)性要求高,網(wǎng)絡(luò)傳輸RTT高的情景下可能帶來(lái)明顯的性能提升。
2.4 多線程并發(fā)寫
在客戶端開啟多個(gè)HTable寫線程,每個(gè)寫線程負(fù)責(zé)一個(gè)HTable對(duì)象的flush操作,這樣結(jié)合定時(shí)flush和寫buffer(writeBufferSize),可以既保證在數(shù)據(jù)量小的時(shí)候,數(shù)據(jù)可以在較短時(shí)間內(nèi)被flush(如1秒內(nèi)),同時(shí)又保證在數(shù)據(jù)量大的時(shí)候,寫buffer一滿就及時(shí)進(jìn)行flush。下面給個(gè)具體的例子:
?
for?(int?i = 0; i < threadN; i++) {
????Thread th = new?Thread() {
????????public?void?run() {
????????????while?(true) {
????????????????try?{
????????????????????sleep(1000); //1 second
????????????????} catch?(InterruptedException e) {
????????????????????e.printStackTrace();
????????????????}
synchronized?(wTableLog[i]) {
????????????????????try?{
????????????????????????wTableLog[i].flushCommits();
????????????????????} catch?(IOException e) {
????????????????????????e.printStackTrace();
????????????????????}
????????????????}
????????????}
}
????};
????th.setDaemon(true);
????th.start();
}
總結(jié)
以上是生活随笔為你收集整理的HBase性能优化方法总结(二):写表操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HBase性能优化方法总结(一):表的设
- 下一篇: HBase性能优化方法总结(三):读表操