HBase 0 1 0 Put流程原始碼分析

2021-08-27 07:19:30 字數 1445 閱讀 6335

put的過程相對比較簡單,因為根據lsm-tree的理論,寫入操作會寫入到記憶體中,然後再batch的寫入磁碟。

hbase的實現也是如此。

首先,從客戶端的batch操作中提取出所有的put操作並放在乙個sortedmap中(localput):

text row = b.getrow();

long lockid = obtainrowlock(row);

long committime =

(timestamp == latest_timestamp) ? system.currenttimemillis() : timestamp;

try

} else

deletes.add(op.getcolumn());

} else

}if (val != null)

}

localput將batch中的put操作的資料存放在targetcolumns中,再用update方法update到每個hstore的memcache中:

treemapedits = this.targetcolumns.remove(long.valueof(lockid));

if (edits != null && edits.size() > 0)

update的過程分為以下幾個步驟:

1.hlog增加此次操作的資訊

2.遍歷每個edit資訊。取出key和value,增加memcache的size

3.新增key和value到memcache裡

4.如果size大於memcacheflushsize則強制flush

regioninfo.gettabledesc().getname(), updatesbycolumn);

long size = 0;

for (map.entrye: updatesbycolumn.entryset())

if (this.flushlistener != null && size > this.memcacheflushsize)

總結:

1.put操作因為只put到記憶體的sortedmap中就返回,因此速度非常快,這也是hbase的lsm-tree引以為豪的地方之一

2.寫入memcache時會先加讀鎖,但好像沒加寫鎖,這是為啥。。。是因為memcache裡的sortedmap是collections.synchronizedsortedmap的嗎?

3.可以看出是put的過程是先寫hlog再寫記憶體的,因此只要寫到記憶體的資料就可以認為是安全的了

4.每次寫入memcache都會check是否到了flush的size,如果到了就會觸發flush。

5.flush會將記憶體中的資料寫入hdfs檔案系統。這種定期batch的寫檔案效率是非常高的,而且在沒有flush時不佔讀的io,無形中留了很多io給讀操作,增加了讀的效能

Hbase原始碼分析3 從Put到HFile

hbase插入資料的過程大致是 客戶端提交請求給region server 這中間會有作一些快取 region server接收到請求,判斷其實put請求,將其put到memstore 每次memstore的操作,都會檢查memstore是否操作乙個閾值,如果超過,就開始執行flush 這個flus...

Hbase原始碼分析3 從Put到HFile

hbase插入資料的過程大致是 客戶端提交請求給region server 這中間會有作一些快取 region server接收到請求,判斷其實put請求,將其put到memstore 每次memstore的操作,都會檢查memstore是否操作乙個閾值,如果超過,就開始執行flush 這個flus...

Hbase原始碼分析3 從Put到HFile

hbase插入資料的過程大致是 客戶端提交請求給region server 這中間會有作一些快取 region server接收到請求,判斷其實put請求,將其put到memstore 每次memstore的操作,都會檢查memstore是否操作乙個閾值,如果超過,就開始執行flush 這個flus...