使用SparkSQL時,我正在瀏覽Parquet,ORC等幾種文件格式。我偶然發現Carbondata並試圖理解它。 令我驚訝的是,目前沒有太多資源可以幫助我立即理解基礎知識。 這篇博客文章將嘗試使用官方文檔從基礎上解釋Carbondata。
概述:
· 基本介紹
· 需要統一文件格式
· Carbondata結構,詳細說明了數據工程中使用的基本術語
· 下一步是什麼?
那麼,什麼是Apache Carbondata?
Apache CarbonData是一種索引的列式數據格式,用於在大數據平臺上進行快速分析,例如 Apache Hadoop,Apache Spark等
資料來源:https://carbondata.apache.org/
簡而言之,Carbondata將使您能夠使用單個副本訪問整個數據。 查詢處理中的挑戰是我們有不同類型的查詢:
· OLAP查詢和詳細查詢。
· 大掃描查詢和小掃描查詢:您可能有需要比較大掃描的查詢,也可能有在較小區域內掃描的查詢。
· 點查詢:消耗大表的很少部分。
因此,統一的文件格式使您可以擁有不同類型的查詢(導致不同類型的數據訪問)。
正如Apache所聲稱的,您可以使用此列存儲快速查詢PB級數據。
讓我們開始討論CarbonData文件格式的體系結構。 簡而言之,它具有三個組成部分:文件頭,文件尾和小塊。
什麼是小塊?
· carbondata文件中的數據集
· 每個小塊包含每個列的一個列塊
· 一列塊可能包含一個或多個列頁面,具體取決於所使用文件格式的版本
讓我給您一些有關列頁面的可視化信息。 假設您有4頁的數據,每頁包含25行和4列。 Carbondata的數據塊將包含列塊,並在其中包含列頁面,即它將包含從第1頁到第4頁的列數據(不是所有數據)。
文件頁腳在這裡很重要。 CarbonData利用它來進行快速查詢處理和優化掃描,這僅僅是因為它是在內存中讀取的。
與文檔中一樣,我們首先討論文件目錄結構。
CarbonData文件存儲在由carbon.storelocation配置指定的位置(在carbon.properties中配置;如果未配置,默認值為../carbon.store)。
這是結構,取自文檔:
再次從文檔中對此結構進行說明:
· ModifiedTime.htmlt使用文件的修改時間屬性記錄元數據的時間戳。 使用放置表和創建表時,文件的修改時間將更新。 這對於所有數據庫都是通用的,因此與數據庫並行保存
· 默認名稱是數據庫名稱,其中包含用戶表。當用戶未指定任何數據庫名稱時,將使用默認名稱。 否則,用戶配置的數據庫名稱將是目錄名稱。 user_table是表名。
· 元數據目錄存儲模式文件,表狀態和字典文件(包括.dict,.dictmeta和.sortindex)。 有三種類型的元數據數據信息文件。
· 數據和索引文件存儲在名為Fact的目錄下。 事實目錄具有Part0分區目錄,其中0是分區號。
· Part0目錄下有一個Segment_0目錄,其中0是段號。
· Segment_0目錄中有兩種文件類型,carbondata和carbonindex。
第4點與稱為數據分區的概念有關。 因此,從這個來源開始,最好的解釋是從下面開始的。
想象一下,我們有一本寫在一本書中的百科全書,隨著時間的流逝,歷史和社會事件在這本書中得到了更新。在某些時候,這本書太大了,我們需要用卡車搬運它,因此我們需要將這本書分成幾冊。數據分區是一種在加載主數據期間物理分割數據的技術。使用這種方法,我們將根據用戶設置的規則將表拆分為較小的部分。當我們有非常大的表需要大量時間來讀取整個數據集時,通常會使用它,因此它將使我們能夠改善維護,性能或管理。關於用戶如何對寬數據表進行分區,基本上有兩種方法:水平(按行)或垂直(按列)。水平分區包括將表的行分佈在不同的分區中,而垂直分區包括將表的列分佈。我們不會忘記我們正在處理大量數據,並且將使用分佈式文件系統將信息存儲在群集中。最受歡迎的之一是Hadoop HDFS。
分區和分段有什麼區別?
兩者都用於本地化數據,以便更快地訪問和處理。 分段是指在群集的所有節點之間組織和分配數據。 分區意味著在群集的節點內組織數據。
文件內容詳細信息
創建表後,將生成user_table目錄,並在Metadata目錄中生成用於記錄表結構的架構文件。
批量加載數據時,每次批量加載都會生成一個新的段目錄。 調度嘗試控制每個節點上的任務處理數據加載任務。 每個任務將生成多個carbondata文件和一個carbonindex文件。
如您所見,批量加載數據將創建一個新的細分目錄。 段目錄做什麼? 在每個分區(此處為P0)下,您將在所有節點上擁有一個有組織的數據。 這將使Carbondata具有快速的數據清除和高查詢性能。 目的是在所有節點上分佈這批數據,以便它們在執行查詢時可以並行參與。
在全局字典生成期間,如果使用兩次通過方案,則在加載數據之前,將為每個字典編碼列生成相應的dict,dictmeta和sortindex文件,並且預定義字典可以提供部分字典文件 減少需求的方法。 通過掃描全部數據來生成字典編碼的列; 全字典方法還可以提供所有字典代碼列的字典文件,以避免掃描數據。 如果採用單次通過方式,則在加載數據時實時生成全局詞典代碼,加載數據後,將詞典固化為詞典文件。
以下各節使用由thrift文件生成的Java對象描述carbondata文件格式來逐個解釋每個文件的內容(您也可以直接讀取thrift文件中定義的格式)
現在我們知道了文件格式,讓我們討論Carbondata如何存儲用戶數據的架構。
在開始解釋上圖之前,我們應該瞭解存儲桶表的含義。
存儲桶是一種將數據均勻分佈在許多文件中的方法。 …每個存儲區的數據都存儲在HDFS上表目錄下的單獨HDFS文件中。
桶是分區的替代方法。 它將數據集分解為更易於管理的部分。
如果您感到困惑或想要更清楚地瞭解什麼是存儲分區或存儲分區與分區之間的區別,請在StackOverflow上閱讀此答案。
現在,對模式圖的說明:
· TableSchema類TableSchema類不存儲表名,它是從目錄名(user_table)推斷出來的。 tableProperties用於記錄與表相關的屬性,例如:table_blocksize。
· ColumnSchema類編碼器用於記錄列存儲中使用的編碼。 columnProperties用於記錄與列相關的屬性。
· BucketingInfo類創建存儲桶表時,可以指定表中的存儲桶數以及要拆分存儲桶的列。
· DataType類描述CarbonData支持的數據類型。
· 編碼類CarbonData文件中可能使用的幾種編碼。
到目前為止,一切都與CarbonData如何存儲有關您的數據的東西有關。 現在,我們將研究CarbonData如何存儲我們的數據。
CarbonData文件格式
我已經在上面描述了文件格式是什麼。 我希望該圖可以幫助您更好地可視化它。
我沒有告訴您有關Blocklets的不同版本。 這與數據的版本控制無關。
因此,共有三個版本:V1,V2和V3
塊包括所有列數據頁,RLE頁和rowID頁。 由於小塊中的頁面是根據頁面類型進行分組的,因此每列的三段數據被分配並存儲在小塊中,並且所有頁面的偏移量和長度信息都需要記錄在頁腳部分中。
· RLE是遊程長度編碼
· 頁腳存儲在內存中讀取的偏移量和長度信息。
該小塊由所有列的ColumnChunk組成。 列的ColumnChunk由ColumnPage組成,其中包括數據塊標題,數據頁面,RLE頁面和rowID頁面。 由於ColumnChunk將列的三種類型的Page數據聚合在一起,因此它可以使用更少的讀取器來讀取列數據。 由於頁眉部分記錄了所有頁面的長度信息,因此頁腳部分只需要記錄ColumnChunk的偏移量和長度,還可以減少頁腳數據量。
與V1相比,V2在以下方面得到了改進:
· 所有列均以列組塊的形式存儲,而V1具有所有列數據頁,即在V1中,如果列C1存在於3頁中,則將顯示所有頁。 而在V2中,所有列都將存在。
· V1,V2中除了提供的數據頁,RLE頁和rowID頁之外,還具有數據塊頭。
· 在V1中,頁腳記錄所有頁面的偏移量和長度信息,而在V2中,頁腳記錄ColumnChunk的偏移量和長度。 由於列塊的長度小於存儲所有頁面的長度,因此V2中的頁腳大小小於V1中的頁腳大小。 因此,由於讀取頁腳並將其存儲在內存中,因此V2將比V1使用更少的內存。
塊還由所有列的ColumnChunks組成。 所更改的是ColumnChunk由一個或多個Column Pages組成,並且Column Page添加了一個新的BlockletMinMaxIndex。
與V2相比:V2格式的塊數據量默認為120,000行,而V3格式的塊數據量默認為64MB。 對於相同大小的數據文件,頁腳部分索引元數據的信息可能會進一步減少。 同時,V3格式添加了一個新頁面。 級別數據過濾,默認情況下每頁的數據量僅為32,000行,這遠遠小於V2格式的120,000行。 數據過濾的準確性進一步提高,可以在解壓縮數據之前過濾掉更多數據。
希望您現在瞭解V1,V2和V3文件格式之間的主要區別。
在代碼教程中,我將使用一些大小為200GB或更大,至少1億行和50列的示例開放數據集。 代碼教程將比較不同文件格式的數據集:orc,carbondata和parquet。
(本文翻譯自Aviral Srivastava的文章《Understanding Apache Carbondata from the basics — Part I》,參考:https://medium.com/@aviralsrivastava/understanding-apache-carbondata-from-the-basics-part-i-629eb1c8ded1)
閱讀更多 聞數起舞 的文章