自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實用 | Apache Kudu讀寫路徑

大數(shù)據(jù)
本篇博文能夠對Kudu的讀寫路徑進行清晰簡明的概述,并且使讀者理解Kudu如何能夠在不斷變化的數(shù)據(jù)上支持快速的分析訪問模式。

[[191417]]

Kudu的體系架構已經(jīng)具備了提供良好分析性能的能力,同時還能夠接收插入和更新操作的連續(xù)流。為了使用戶能夠專注于其最關心的內容,Kudu提供了簡單的API,而封裝了后臺的復雜性。但是一些高級用戶希望了解內部部件,以理解Kudu如何能夠快速分析快速數(shù)據(jù),以及如何更好地利用其功能。本篇博文旨在向用戶介紹向Kudu內寫入數(shù)據(jù)以及從Kudu中讀取數(shù)據(jù)時在其后臺會發(fā)生什么。本篇博文假設讀者對本文中所介紹的Kudu架構已經(jīng)有一個基本的了解。

多版本并發(fā)控制(MVCC)

數(shù)據(jù)庫使用并發(fā)控制方法確保用戶始終看到一致性的結果,不管是否進行并發(fā)寫入操作。Kudu使用了一種稱為多版本并發(fā)控制(MVCC)的方法,該方法可以跟蹤正在進行的操作,并通過確保讀取操作只能讀到已提交的操作來保證一致性。Kudu使用多版本并發(fā)控制(MVCC)的主要優(yōu)點是允許讀取者(通常是大型掃描程序)不必獲取鎖定,分析作業(yè)不會阻止同一數(shù)據(jù)上的并發(fā)寫入者,這樣就可以顯著提高其掃描性能。每個寫入都使用系統(tǒng)生成的時間戳進行標記,該時間戳保證在tablet中是唯一的。當用戶創(chuàng)建掃描程序從tablet讀取數(shù)據(jù)時,他們可以選擇兩種讀取模式:

  • READ_LATEST(默認)在tablet中獲取多版本并發(fā)控制(MVCC)當前狀態(tài)的快照,無法保證***版本。也就是說,該功能可讀取在副本上提交的任何寫入,但是由于寫入可以無序執(zhí)行,所以不保證其一致性。而且由于副本可能落后于同一tablet中的其他副本,因此不能保證讀取的是***版本。
  • READ_AT_SNAPSHOT可以獲取多版本并發(fā)控制(MVCC)的快照,其中包括基于特定時間戳的行版本,無論是用戶選擇還是系統(tǒng)選擇(“當前”時間)。tablet等到這個時間戳是“安全的”(即已經(jīng)完成所有具有較低時間戳的飛行中寫入操作),并且由于具有較晚的時間戳,tablet中的進一步寫入將被掃描程序忽略。在這種模式下,掃描是一致且可重復的。

通過提供您自己的掃描時間戳,第二種快照類型具備發(fā)布 “時間行程讀取”的能力,這反映了在該時間點數(shù)據(jù)庫的狀態(tài)。這意味著用戶只能看到單個版本的行,但在內部Kudu可以存儲行的多個版本以提供多版本并發(fā)控制(MVCC)快照功能。

Raft

Kudu中的表被分割成稱為tablet的連續(xù)片段,并且為了實現(xiàn)容錯功能,每個tablet都在多個tablet服務器上進行復制。 Kudu使用Raft一致性算法以保證對tablet進行的更改獲得其所有副本的同意。在任何時候,其中一個副本會被選為***,而其他則是追隨者。任何副本都可以為讀取提供服務,但只有***可以接受寫入。Raft保留了復制的操作日志,只有在大多數(shù)副本被持久存儲在日志中時才會對其進行確認。復制日志是一個抽象概念,實際上由tablet的寫入日志(WAL)表示。具有N個副本(通常為3或5個)的tablet可以繼續(xù)接受最多(N-1)/ 2個副本的失敗。

Tablet發(fā)現(xiàn)

當創(chuàng)建Kudu客戶端時,其會從主服務器上獲取tablet位置信息,然后直接與服務于該tablet的服務器進行交談。為了優(yōu)化讀取和寫入路徑,客戶端將保留該信息的本地緩存,以防止他們在每個請求時需要查詢主機的tablet位置信息。隨著時間的推移,客戶端的緩存可能會變得過時,并且當寫入被發(fā)送到不再是tablet***的tablet服務器時,則將被拒絕。然后,客戶端將通過查詢主服務器發(fā)現(xiàn)新***的位置來更新其緩存。

 

寫入路徑

寫入操作是指需進行插入、更新或刪除操作的一組行。需要注意的事項是Kudu強制執(zhí)行主關鍵字的唯一性,主關鍵字是可以更改行的唯一標識符。為了強制執(zhí)行此約束條件,Kudu必須以不同的方式處理插入和更新操作,并且這會影響tablet服務器如何處理寫入。

 

Kudu中的每個tablet包含預寫式日志(WAL)和多個行集合(RowSet),它們是保存在存儲器和磁盤上(被刷新時)的不相交的行集合。寫入操作先被提交到tablet的預寫式日志(WAL),并根據(jù)Raft 一致性算法取得追隨節(jié)點的同意,然后才會被添加到其中一個tablet的內存中:插入會被添加到tablet的MemRowSet中。為了在MemRowSet中支持多版本并發(fā)控制(MVCC),對最近插入的行(即尚未刷新到磁盤的新的行)的更新和刪除操作將被追加到MemRowSet中的原始行之后以生成重做(REDO)記錄的列表。讀取者需要應用相關的重做(REDO)記錄,根據(jù)掃描程序給定的時間戳構建行的正確快照。

當MemRowSet填滿時,則被刷新到磁盤并成為一個DiskRowSet。為了支持磁盤中存儲數(shù)據(jù)的多版本并發(fā)控制(MVCC)功能,DiskRowSets被分為兩種不同的文件類型。 MemRowSet中行的***版本(即應用了其所有重做(REDO)記錄的原始插入)被寫入到基礎數(shù)據(jù)文件。這是一種柱狀文件格式(非常像Parquet),用于快速、高效的讀取訪問,其賦予了Kudu支持分析訪問模式的能力。MemRowSet中存在的行的先前版本(即重做(REDO)記錄的倒序)作為一組撤銷(UNDO)記錄寫入增量文件。時間行程讀取可以應用相關的撤銷(UNDO)記錄,從早期的時間點構建行的正確快照。

更新已被編碼和壓縮的柱狀格式化數(shù)據(jù)文件需要重寫整個文件,因此基礎數(shù)據(jù)文件一旦被刷新則被認為是不可變的。此外,行關鍵字唯一性約束意味著基本記錄的更新和刪除不能被添加到tablet的MemRowSet中,而是被添加到名為DeltaMemStore的單獨的內存存儲器中。像MemRowSet一樣,所有的變化都將被添加到DeltaMemStore中作為一組重做(REDO)記錄;當DeltaMemStore填滿時,重做(REDO)記錄將被刷新到磁盤上存儲的增量文件中。每個DiskRowSet都存在一個單獨的DeltaMemStore。如需構建行的正確快照,讀取者必須在應用相關撤銷(UNDO)或重做(REDO)記錄之前首先找到行的基本記錄。

壓縮 隨著時間的推移,tablet會積累許多DiskRowSets,并且會在行更新時累積很多增量重做(REDO)文件。當插入一個關鍵字時,為了強制執(zhí)行主關鍵字唯一性,Kudu會針對RowSets查詢一組布隆過濾器,來找到可能包含該關鍵字的Rowset。越多的布隆過濾器檢查及隨后的DiskRowSet搜索,寫入操作就會變得越慢。隨著更多DiskRowSets的積累,必須采取措施確保寫入性能不會下降。此外,隨著每個RowSet累積更多的重做(REDO)增量文件,為了將基礎數(shù)據(jù)轉換為行的***版本,需要執(zhí)行更多的工作掃描。這意味著如果不采取任何行動,讀取性能也會隨時間而下降。Kudu可以通過執(zhí)行壓縮功能來處理這些問題,其中包括三種類型的壓縮:

  • 微小增量壓縮(Minor delta compaction)可以在不會觸及基礎數(shù)據(jù)的前提下,通過將增量文件合并在一起以減少文件的數(shù)量。其結果是讀取操作必須尋求更少的增量文件來生成當前版本的行。
  • 重大增量壓縮(Major delta compaction)將重做(REDO)記錄遷移到撤銷(UNDO)記錄中,并更新基礎數(shù)據(jù)。考慮到大多數(shù)讀取將讀取最近的快照(從基礎數(shù)據(jù)的時間向前計算),并且基礎數(shù)據(jù)將以最有效的方式進行存儲(被編碼和壓縮),最小化重做(REDO)記錄存儲的數(shù)量可以獲得更有效的讀取。在重大壓縮期間,行的重做(REDO)記錄可以合并到基礎數(shù)據(jù)中,并替換為包含先前版本行的等效的撤銷(UNDO)記錄集。可以對列的任何子集執(zhí)行重大壓縮,因此如果某列與其他列相比收到更多的更新,就可以在單個列上執(zhí)行壓縮,通過避免重寫未更改的數(shù)據(jù)以減少重大增量壓縮的I / O。
  • 行集合壓縮(RowSet compaction)可以將范圍內重疊的行集合(RowSets)組合在一起,從而生成更少的行集合(RowSets),從而加快寫入速度。

這是針對壓縮過程的簡要介紹,旨在方便讀者理解Kudu執(zhí)行的后臺工作以管理和優(yōu)化其物理存儲。在博客中我們將發(fā)表后續(xù)文章更詳細地描述該壓縮過程。讀取路徑 當客戶端從Kudu的表中讀取數(shù)據(jù)時,必須首先建立需要連接的系列tablet服務器。通過執(zhí)行tablet發(fā)現(xiàn)過程(如上所述)來確定包含要讀取的主關鍵字范圍的tablet的位置(讀取不必在***tablet上發(fā)生,除非用戶明確選擇該選項)。tablet隨后使用掃描程序基于行集合(RowSets)和相關撤銷(UNDO)或重做(REDO)增量記錄生成最終行。首先,tablet必須確定包含基本記錄的行集合(RowSet)。然后掃描MemRowSet以及一個或多個DiskRowSets。***,tablet將遍歷所選的行集合(RowSet),匹配該掃描的謂詞并生成最終記錄。

在MemRowSet中,掃描程序將實現(xiàn)每一行的完整投影并應用任何增量記錄。由于所有操作都發(fā)生在內存中因此可以非??焖俚赝瓿?。對于每一個DiskRowSet而言,掃描程序將每次實現(xiàn)一列,并且在轉到下一列前應用對當前列任何增量記錄和謂詞。 只有與掃描的謂詞匹配的列才可以從磁盤讀取,這使得磁盤I / O非常高效,也賦予了Kudu快速的分析性能。Kudu將優(yōu)先掃描已定義謂詞的列。如果謂詞不滿足的話,Kudu可以完全避免掃描其他列,從而避免不必要的I / O。

本篇博文能夠對Kudu的讀寫路徑進行清晰簡明的概述,并且使讀者理解Kudu如何能夠在不斷變化的數(shù)據(jù)上支持快速的分析訪問模式。

責任編輯:武曉燕 來源: 36大數(shù)據(jù)
相關推薦

2016-11-23 09:57:45

Apache KuduHadoop存儲

2017-06-26 15:00:17

2025-01-13 09:00:00

Python文件讀寫代碼

2024-11-19 18:32:12

Python路徑操作

2024-08-27 12:18:23

函數(shù)Python

2025-02-28 09:05:38

2021-02-26 20:55:56

JavaNIO隨機

2017-02-20 07:57:42

Kudu快速分析Hadoop

2025-04-03 10:01:14

2014-02-14 15:12:41

ApacheMesos架構

2014-02-14 15:43:16

ApacheSpark

2014-01-02 16:06:03

PostgreSQL實用函數(shù)

2013-04-26 10:59:54

目錄遍歷漏洞

2025-02-04 17:24:22

2021-08-05 10:00:02

Python編程語言

2013-06-09 12:49:15

Android開發(fā)XML讀寫XML解析

2013-06-09 13:07:23

Android開發(fā)XML讀寫XML解析

2013-06-09 10:04:35

Android開發(fā)XML讀寫XML解析

2013-06-09 12:53:05

Android開發(fā)XML讀寫XML解析

2023-11-15 18:46:49

HBase數(shù)據(jù)庫開源
點贊
收藏

51CTO技術棧公眾號