kudu 的基本架構 儲存結構與讀寫原理

2021-09-12 23:09:19 字數 2791 閱讀 7316

tmaster 主要用來管理元資料,即tablet 和 表的基本資訊,監聽tserver的狀態,tmaster之間通過raft協議進行資料同步

tserver 主要用來管理tablet 。tablet 負責這一張表的某塊內容的讀寫,接受其他tablet leader 傳來的同步資訊,至於什麼是tablet,看下面。

kudu的整個儲存架構可以看成這樣:

一張table 會分成若干個tablet ,每個tablet中會包含的是 metadata(元資訊)和 若干個rowset,每個rowset裡面包含的是memrowset 和若干個diskrowset,其中memrowset負責的是儲存插入和更新的資料,當memrowset 寫滿後(預設是1g或者兩分鐘),會刷寫到diskrowset(磁碟中)。

diskrowset用於對老資料的mutation(變化)操作,例如對資料更新,合併,刪除歷史和無用資料,減少查詢過程的io開銷。乙個diskrowset中,包含乙個boomfile、乙個ad_hoc index、多個undofile、redofile、basedata和deltamem

memrowset的實現方式是 b+樹

diskrowset的實現方式是二叉平衡樹,他的內部資料組織是在記憶體(deltamem)中是b+樹,在磁碟中存放在cfile檔案中。

diskrowset的資料在磁碟上的分布情況:

kudu是乙個真正的面像列式儲存的資料庫,表中的每乙個列都是單獨存放的;

kudu在建表的時候要求制定每一列的型別,為了給每一列設定制定合適的編碼格式,實現更高的資料壓縮比,降低io;

kudu在儲存的時候也加入timestamp這個字段,只是並不是用來更新或插入資料使用,而是在scan 的時候可以設定timestamp,檢視歷史資料;

kudu為了提高批量讀取的效率,要求設定主鍵並且唯一,這樣的話,kudu在更新資料的時候就不能向hbase那樣,直接插入一條新的資料就可以了,kudu的選擇是將插入和更新操作分開進行;

寫流程:

a)插入操作:

客戶端連線到tmaster獲取表的相關資訊(分割槽和tablet資訊);

找到負責寫請求的tablet 所在的tserver,kudu接受客戶端的請求,檢查本次寫操作是否符合要求;

kudu在 tablet 中所有rowset 中,查詢是否存在與待插入資料相同主鍵的記錄,如果存在,返回錯誤?否則繼續;

寫入操作先被提交到tablet 的預寫日誌(wal)上,然後根據raft 一致性演算法取得追隨節點的同意後,才會被新增到其中乙個tablet 的記憶體中,插入到menrowset中。(因為在memrowset 中支援了多版本併發控制(mvcc) ,對最近插入的行(未重新整理到磁碟上的新的行)的更新和刪除操作將被追加到memrowset中的原始行之後以生成redo 記錄的列表)。

kudu在memrowset 中寫入新資料,在memrowset 達到一定大小或者時間限制(1g 或者 120s),memrowset 會將資料落盤,生成乙個diskrowset 用於持久化資料 和 乙個 memrowset 繼續接受新資料的請求。

b)更新操作:

客戶端連線到tmaster獲取表的相關資訊(分割槽和tablet資訊);

找到負責寫請求的tablet 所在的tserver,kudu接受客戶端的請求,檢查本次寫操作是否符合要求;

因為待更新的資料可能位於memrowset ,也可能位於diskrowset 中,所以根據待更新的資料所處的位置,kudu有不同的做法:

a) 當待更新的資料位於memrowset時,找到它所在的行,然後將跟新操作記錄在所在行中的乙個mutation的鍊錶中,在memrowset 資料落地的時候,kudu會將更新合併到base data,並生成undo records 用於檢視歷史版本的資料和mvcc, undo records 實際上也是以 deltafile 的形式存放;

b)當待跟新的資料位於diskrowset時,找到待跟新資料所在的diskrowset ,每個diskrowset 都會在記憶體中設定乙個deltamemstore,將更新操作記錄在deltamemstore中,在deltamemstore達到一定大小時,flush 在磁碟,形成delta並存放在deltafile中。

簡單說就是將基線資料basedata 和 更新合併起來,生成新的基線資料,通過這種方式來更行。

讀流程:

客戶端連線tmaster 獲取表的相關資訊,包括分割槽和表中的tablet 的資訊;

客戶端找到 tablet 所在的tserver 以後,kudu接受讀請求,並記錄timestamp(沒有顯示指定就使用當前時間)資訊;

從記憶體中讀取資料,即是從memrowset 和 deltarowset中讀取資料,根據timestamp來找到對應的mutation鍊錶;

從磁碟中讀取資料,從metadata檔案中使用boom

filter 快速模糊的判斷所有候選的rowset中是否包含此key,然後從diskrowset 中讀取資料,實際上是根據b+樹,判斷key 在這些diskrowset 中的range 範圍內,然後從metadata檔案中,獲取index來判斷rowid 在data中的偏移,根據讀操作中的timestamp 資訊判斷是否需要對basedata中的資料進行回滾,從而獲取資料。

這個人講解的很透徹

總結:

Hive簡介 基本架構與儲存結構

2.hive的基本架構 3.hive的儲存模型 reference 1.1 什麼是hive?hive是facebook實現的乙個開源的資料倉儲工具 這裡還需要理解一下資料倉儲,資料倉儲可以簡單理解為存放不同資料來源 比如公司支撐不同業務的資料庫 的倉庫,主要用於查詢和分析,也就是基於這些資料去做報表...

YARN 設計理念與基本架構

排程器 該排程器是乙個 純排程器 不再參與任何與具體應用程式邏輯相關的工作,而僅根據各個應用程式的資源需求進行分配,資源分配的單位用乙個資源抽象概念 container 來表示。container 封裝了記憶體和 cpu。此外,排程器是乙個可插拔的元件,使用者可根據自己的需求設計新的排程器,yarn...

YARN 設計理念與基本架構

排程器 該排程器是乙個 純排程器 不再參與任何與具體應用程式邏輯相關的工作,而僅根據各個應用程式的資源需求進行分配,資源分配的單位用乙個資源抽象概念 container 來表示。container 封裝了記憶體和 cpu。此外,排程器是乙個可插拔的元件,使用者可根據自己的需求設計新的排程器,yarn...