2016-04-24 41 views
48

特點是:與其他格式相比,實木複合地板格式有哪些優缺點? Apache的實木複合地板的

  • 自描述
  • 列格式
  • 語言無關

相較於Avro的,序列文件,RC文件等我想概述的格式。我已經閱讀:How Impala Works with Hadoop File Formats,它提供了有關格式的一些見解,但我想知道如何以這些格式的每一種格式訪問數據存儲的數據。木條地板如何比其他地方有優勢?

+1

一個很好的總結可以在此演示文稿中找到:[鏈接](http://www.slideshare.net/StampedeCon/choosing-an-hdfs-data-storage-format-avro-vs-實木複合地板和更stampedecon-2015) – Dominik

回答

97

我認爲我可以描述的主要區別與面向記錄和麪向列的格式有關。面向記錄的格式是我們都習慣的格式 - 文本文件,CSV,TSV等分隔格式。 AVRO比那些稍冷,因爲它可以隨時間改變模式,例如添加或刪除記錄中的列。各種格式的其他技巧(特別是壓縮)涉及是否可以拆分格式 - 也就是說,您是否可以從數據集中的任何位置讀取一段記錄,並仍然知道它的模式?但是更多關於Parquet等柱狀格式的細節。

實木複合地板和其他柱狀格式非常有效地處理常見的Hadoop情況。在設計良好的關係數據庫中,表(數據集)的列數多於預期的情況很常見 - 一兩百列不是不常見的。這是因爲我們經常使用Hadoop作爲非規範化來自關係格式的數據的地方 - 是的,您可以獲得大量重複值,並且許多表格都被整合到一個表格中。但由於所有連接都已經完成,查詢變得更加容易。還有其他一些優點,例如保留時間狀態數據。無論如何,在桌子上放置一大堆柱子是很常見的。

比方說,有132列,其中一些是真正的長文本字段,每個不同的列一個接一個,並用完每個記錄10K。

從SQL的角度來看,查詢這些表格很容易,但通常只需要基於幾百個以上的列來獲取一些範圍的記錄。例如,對於銷售額> 500美元的客戶,您可能需要2月和3月的所有記錄。

要以行格式執行此操作,查詢將需要掃描數據集的每條記錄。閱讀第一行,將記錄解析爲字段(列)並獲取日期和銷售列,並在滿足條件時將其包含在結果中。重複。如果你有10年(120個月)的歷史,你正在閱讀每一條記錄,以找出其中的2個月。當然,這是在每年和每月使用一個分區的好機會,但即便如此,爲了查明客戶的銷售額是否超過500美元,您仍然在閱讀並解析這兩個月每條記錄/行的10K。

以列狀格式,記錄的每個列(字段)都與其他類型一起存儲,分佈在磁盤上的許多不同的塊上 - 列爲一年,列爲一個月,列爲客戶員工手冊(或其他長文本)以及使這些記錄非常龐大的其他所有內容都放在磁盤上的獨立位置,當然還有一起銷售的專欄。好吧,日期和月份是數字,銷售也是如此 - 它們只是幾個字節。如果我們只需要爲每條記錄讀取幾個字節來確定哪些記錄與我們的查詢相匹配,那不是很好嗎?縱向倉儲救援!

即使沒有分區,掃描所需的小字段以滿足我們的查詢速度也是超快的 - 它們都是按照記錄順序排列的,並且大小都一樣,所以磁盤對包含記錄的數據檢查要少得多。無需閱讀該員工手冊和其他長文本字段 - 只需忽略它們即可。因此,通過將列彼此分組而不是行,您幾乎總是可以掃描更少的數據。贏得!

但是,等一等,它會變得更好。如果你的查詢只需要知道這些值和更多(比如說132列中的10)並且不關心該員工手冊專欄,那麼一旦它選擇了正確的記錄返回,它現在只需要去回到它需要渲染結果的10列,而忽略數據集中其他122個。再次,我們跳過了很多閱讀。 (注意:因爲這個原因,當進行直接轉換時,柱狀格式是一個糟糕的選擇,例如,如果您將兩個表中的所有表合併成一個大的(ger)結果集並保存爲新的表格中,源代碼將被完全掃描,所以在讀取性能方面沒有太多好處,而且因爲列式格式需要記住更多關於內容的地方,所以它們使用的內存比類似的行格式要多)。

柱形的另一個好處是:數據傳播開來。要獲得單個記錄,您可以讓132名工作人員分別從132個數據塊的132個不同位置讀取(並寫入)數據。 Yay並行化!

而現在硬道理:壓縮算法運行得更好時,它可以找到重複的模式。您可以將AABBBBBBCCCCCCCCCCCCCCCC壓縮爲2A6B16C,但ABCABCBCBCBCCCCCCCCCCCCCC不會變小(實際上,在這種情況下,它會,但相信我:-))。所以再次少閱讀。寫作也是。

所以我們讀少了很多的數據來回答常見疑問,這是有可能更快地並行讀取和寫入,並壓縮往往會運行得更好。

柱狀是偉大的,當你輸入側大,你的輸出濾波子集:由大到小是很大的。當輸入和輸出大致相同時,不那麼有利。

但是對我們來說,帕拉了我們在5,10,20或30分鐘跑老蜂巢查詢,並完成了大部分在幾秒鐘或一分鐘。

希望這有助於回答您的問題的至少一部分!

+1

優秀。謝謝。是這是一個從許多Apache項目文檔缺少一個非常有用的總結。你提到:「小場......都是爲了通過記錄」。假設我有用戶ID的一個簡單的表:長,年齡:INT,並希望找到一些所有年齡的用戶。這裏我有兩列。我是否需要指定是排序的索引時,或者是所有的列有效的可轉位? – user48956

+0

一個最好的,我已經閱讀至今。謝謝湯姆! –

10

湯姆的回答是相當細緻和詳盡的,但你也可能有興趣在this simple study有關木地板VS Avro公司在Allstate保險公司完成,總結如下:

「總體來看,實木複合地板表現出對每個測試類似的或更好的效果[比Avro] Parquet支持的較大數據集的查詢性能差異部分歸因於壓縮結果;在查詢寬數據集時,Spark必須讀取Parquet的數據量比Avro少3.5倍Avro在處理整個數據集,如懷疑。「

19

Avro是Hadoop的基於行的存儲格式。

鑲木爲Hadoop的基於列的存儲格式。

如果你的使用情況通常會掃描或檢索所有在每個查詢的行字段,Avro公司通常是最好的選擇。

如果數據集有許多列,你的使用情況通常涉及與這些列,而不是整個記錄的一個子集工作,實木複合地板是爲那種工作的優化。

Source