kudu的介紹:kudu在 hdfs 和 hbase 這兩個中平衡了隨機讀寫和批量分析的效能,既支援了sql實時查詢,也支援了資料更新插入操作
kudu 術語:
tablet(段):乙個tablet是一張table連續的segment,與其它資料儲存引擎或關係型資料庫partition(分割槽)相似。在一定的時間範圍內,tablet的副本冗餘到多個tserver伺服器上,其中乙個副本被認為是leader tablet。任何副本都可以對讀取進行服務,並且寫入時需要為tablet服務的一組tablet server之間達成一致性。一張表分成多個tablet,分布在不同的tablet server中,最大並行化操作,tablet在kudu中被切分為更小的單元,叫做rowsets,rowsets分為兩種memrowsets和diskrowset,memrowsets每生成32m,就溢寫到磁碟中,也就是diskrowset
catalog table(目錄表):catalog table是kudu 的 metadata(元資料中)的中心位置。它儲存有關tables和tablets的資訊。該catalog table(目錄表)可能不會被直接讀取或寫入。相反,它只能通過客戶端 api中公開的元資料操作訪問
metadata: block和block在data中的位置。
memrowset:其中memrowset用於儲存insert資料和update後的資料,寫滿後會重新整理到磁碟中也就是多個diskrowset中,預設是1g重新整理一次或者是2分鐘。
bloomfile:根據diskrowset中key生成乙個bloom filter,用於快速模糊的定位某乙個key是否在diskrowset中。
ad_hoc index:是主鍵的索引,用於定位key在diskrowset中具體哪個偏移位置。
basedata:是memrowset flush下來的資料,按照列儲存,按照主鍵有序。
undofile:是basedata之前的資料歷史資料。
redofile:是basedata之後的mutation記錄,可以獲得較新的資料。
deltamem:用於在記憶體中儲存mutation記錄,先寫到記憶體中,然後寫滿後flush到磁碟,形成deltafile。
minor compaction:多個deltafile進行合併生成乙個大的deltafile。預設是1000個deltafile進行合併一次
major compaction:deltafile檔案的大小和base data的檔案的比例為0.1的時候,會進行合併操作,生成undo data
tablet 架構圖:1,kudu中的tablet是負責table表的一部分的讀寫工作,tablet是有多個或乙個rowset組成的,其中乙個rowset處於記憶體中,叫做memrowset,memrowset主要是負責處理新的資料寫入請求。diskrowset是memrowset達到1g重新整理一次或者是時間超過2分鐘後重新整理到磁碟後生成的,實際底層儲存是是有base data(乙個cfile檔案)、多個delta file(undo data、redo data組成)的和delta memstore,其中位於磁碟中的base data、undo data、redo data是不可修改的,delta memstore達到一定程度後會重新整理到磁碟中的生成redo data,其中kudu後台有乙個類似hbase的compaction執行緒策略進行合併處理
2,當建立kudu客戶端時,其會從主master上獲取tablet位置資訊,然後直接與服務於該tablet的伺服器進行交談。為了優化讀取和寫入路徑,客戶端將保留該資訊的本地快取,以防止他們在每個請求時需要查詢主機的tablet位置資訊。隨著時間的推移,客戶端的快取可能會變得過時,並且當寫入被傳送到不是領導者的tablet伺服器時,則將被拒絕。然後,客戶端將通過查詢主伺服器發現新領導者的位置來更新其快取。
讀流程:1、客戶端連線tmaster獲取表的相關資訊,包括分割槽資訊,表中所有tablet的資訊
2、客戶端找到需要讀取的資料的tablet所在的tserver,kudu接受讀請求,並記錄timestamp資訊,如果沒有顯式指定,那麼表示使用當前時間
3、從記憶體中讀取資料,也就是memrowset和deltarowset中讀取資料,根據timestamp來找到對應的mutation鍊錶
4、從磁碟中讀取資料,從metadata檔案中使用boom filter快速模糊的判斷所有候選rowset是否含有此key。然後從diskrowset中讀取資料,實際是根據b+樹,判斷key在那些diskrowset的range範圍內,然後從metadata檔案中,獲取index來判斷rowid在data中的偏移,或者是利用validex來判斷資料的偏移(只有乙個key),根據讀操作中包含的timestamp資訊判斷是否需要將base data進行回滾操作從而獲取資料
寫流程(kudu插入一條新資料):
1、客戶端連線tmaster獲取表的相關資訊,包括分割槽資訊,表中所有tablet的資訊
2、客戶端找到負責處理讀寫請求的tablet所負責維護的tserver。kudu接受客戶端的請求,檢查請求是否符合要求(表結構)
3、kudu在tablet中的所有rowset(memrowset,diskrowset)中進行查詢,看是否存在與待插入資料相同主鍵的資料,如果存在就返回錯誤,否則繼續
4、寫入操作先被提交到tablet的預寫日誌(wal),並根據raft一致性演算法取得追隨節點的同意,然後才會被新增到其中乙個tablet的記憶體中,插入會被新增到tablet的memrowset中。為了在memrowset中支援多版本併發控制(mvcc),對最近插入的行(即尚未重新整理到磁碟的新的行)的更新和刪除操作將被追加到memrowset中的原始行之後以生成redo記錄的列表
5、kudu在memrowset中寫入一行新資料,在memrowset(1g或者是120s)資料達到一定大小時,memrowset將資料落盤,並生成乙個diskrowset用於持久化資料,還生成乙個memrowset繼續接收新資料的請求
資料的更新流程:
1、客戶端連線tmaster獲取表的相關資訊,包括分割槽資訊,表中所有tablet的資訊
2、kudu接受請求,檢查請求是否符合要求
3、因為待更新數資料可能位於memrowset中,也可能已經flush到磁碟上,形成diskrowset。因 此根據待更新資料所處位置不同,kudu有不同的做法
1),當待更新資料位於memrowset時,找到待更新資料所在行,然後將更新操作記錄在所在行中乙個mutation鍊錶中;在memrowset將資料落盤時,kudu會將更新合併到base data,並生成undo records用於檢視歷史版本的資料,redo records實際上也是以deltafile的形式存放
2),當待更新資料位於diskrowset時,找到待更新資料所在的diskrowset,每個diskrowset都會在記憶體中設定乙個deltamemstore,將更新操作記錄在deltamemstore中,在deltamemstore達到一定大小時,flush在磁碟,形成deltafile中。
Kudu的架構以及優勢
hadoop生態系統發展到現在,儲存層主要由hdfs和hbase兩個系統把持著,一直沒有太大突破。在追求高吞吐的批處理場景下,我們選用hdfs,在追求低延遲,有隨機讀寫需求的場景下,我們選用hbase,那麼是否存在一種系統,能結合兩個系統優點,同時支援高吞吐率和低延遲呢?有人嘗試修改hbase核心構...
NSSortDescriptor使用以及陣列排序
nssortdescriptor 指定用於物件陣列排序的物件的屬性。物件可能是字典,這種情況就是對字典陣列排序 如果是employee物件需要按照name來排序,就生成下面的descriptor nssortdescriptor descriptor nssortdescriptor sortdes...
CMFCColorButton的使用以及重繪
cmfccolorbutton是visual studio 2008 sp1版本以上提供的顏色採集器。系統環境 windows 7 程式設計環境 visual studio 2008 sp1 下面介紹下使用步驟 1.新建基於對話方塊的工程,名稱為mycolorbuttondemo 2.拖動乙個按鈕到...