Hadoop三種文件存儲(chǔ)格式Avro译暂、Parquet、ORC

也是知識(shí)崎脉,要了解

URL:
https://zhuanlan.zhihu.com/p/459444652

為什么我們需要不同的文件格式伯顶?

對(duì)于 MapReduce 和 Spark 等支持 HDFS 的應(yīng)用程序來(lái)說(shuō)呛踊,一個(gè)巨大的瓶頸是在特定位置查找相關(guān)數(shù)據(jù)所需的時(shí)間以及將數(shù)據(jù)寫回另一個(gè)位置所需的時(shí)間啦撮。這些問(wèn)題隨著管理大型數(shù)據(jù)集的困難而變得復(fù)雜,例如不斷發(fā)展的模式或存儲(chǔ)限制愉择。

在處理大數(shù)據(jù)時(shí)锥涕,存儲(chǔ)此類數(shù)據(jù)所需的成本更高(Hadoop 冗余存儲(chǔ)數(shù)據(jù)以實(shí)現(xiàn)容錯(cuò))狭吼。除了存儲(chǔ)成本之外,處理數(shù)據(jù)還伴隨著 CPU刁笙、網(wǎng)絡(luò)破花、IO 成本等疲吸。隨著數(shù)據(jù)的增加,處理和存儲(chǔ)的成本也隨之增加摘悴。

各種 Hadoop 文件格式在 數(shù)據(jù)工程解決方案中得到了發(fā)展峭梳,以緩解許多用例中的這些問(wèn)題蹂喻。

選擇合適的文件格式可以帶來(lái)一些顯著的好處:

  1. 更快的讀取時(shí)間
  2. 更快的寫入時(shí)間
  3. 可拆分文件
  4. 模式演變支持
  5. 高級(jí)壓縮支持

一些文件格式是為一般用途而設(shè)計(jì)的葱椭,另一些是為更具體的用例而設(shè)計(jì)的,還有一些是為特定數(shù)據(jù)特征而設(shè)計(jì)的口四。所以有相當(dāng)多的選擇孵运。

Avro 文件格式

[圖片上傳失敗...(image-1ec66-1649317507854)]

Avro 格式是 Hadoop 的一種基于行的存儲(chǔ)格式窃祝,被廣泛用作序列化平臺(tái)粪小。

Avro 格式以 JSON 格式存儲(chǔ)模式探膊,使其易于被任何程序讀取和解釋逞壁。

數(shù)據(jù)本身以二進(jìn)制格式存儲(chǔ),使其在 Avro 文件中緊湊且高效。

vro格式是語(yǔ)言中立的數(shù)據(jù)序列化系統(tǒng)姿骏。它可以被多種語(yǔ)言處理(目前是 C糖声、C++、C#分瘦、Java蘸泻、Python 和 Ruby)。

Avro 格式的一個(gè)關(guān)鍵特性 是對(duì)隨時(shí)間變化的數(shù)據(jù)模式的強(qiáng)大支持嘲玫,即模式演變悦施。Avro 處理模式更改,例如缺少字段去团、添加的字段和更改的字段抡诞。

Avro 格式提供了豐富的數(shù)據(jù)結(jié)構(gòu)。例如土陪,您可以創(chuàng)建包含數(shù)組沐绒、枚舉類型和子記錄的記錄。

[圖片上傳失敗...(image-aa93b7-1649317507854)]

Avro 格式是在數(shù)據(jù)湖登陸區(qū)存儲(chǔ)數(shù)據(jù)的理想選擇旺坠,因?yàn)椋?/p>

1.落地區(qū)的數(shù)據(jù)通常被整體讀取乔遮,以供下游系統(tǒng)進(jìn)一步處理(這種情況下基于行的格式效率更高)。

2. 下游系統(tǒng)可以輕松地從 Avro 文件中檢索表模式(無(wú)需將模式單獨(dú)存儲(chǔ)在外部元存儲(chǔ)中)取刃。

3. 任何源模式更改都很容易處理(模式演變)蹋肮。

列式存儲(chǔ)格式

為了更好地理解 Hadoop 中的 Parquet 和ORC 文件格式,首先我們來(lái)看看什么是列式存儲(chǔ)格式璧疗。在面向列的格式中坯辩,記錄中相同類型的每一列的值存儲(chǔ)在一起。

例如 崩侠,如果有一條記錄包含 ID漆魔、員工姓名和部門,則 ID 列的所有值將存儲(chǔ)在一起却音,Name 列的值將存儲(chǔ)在一起改抡,等等。如果我們采用與上述相同的記錄模式系瓢,具有三個(gè)字段 ID (int)阿纤、NAME (varchar) 和 Department (varchar),則該表將如下所示:

[圖片上傳失敗...(image-c1bf62-1649317507854)]

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">添加圖片注釋夷陋,不超過(guò) 140 字(可選)</figcaption>

對(duì)于此表欠拾,按行存儲(chǔ)格式的數(shù)據(jù)將按如下方式存儲(chǔ):

[圖片上傳失敗...(image-b537ba-1649317507854)]

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">添加圖片注釋胰锌,不超過(guò) 140 字(可選)</figcaption>

然而,面向列的存儲(chǔ)格式中的相同數(shù)據(jù)將如下所示:

[圖片上傳失敗...(image-7a4f5d-1649317507854)]

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">添加圖片注釋藐窄,不超過(guò) 140 字(可選)</figcaption>

當(dāng)您需要從表中查詢幾列時(shí)资昧,列式存儲(chǔ)格式更有效。它將只讀取所需的列荆忍,因?yàn)樗鼈兪窍噜彽拈簧Γ瑥亩钚』?IO。

例如东揣,假設(shè)您只需要 NAME列践惑。 在行存儲(chǔ)格式中,必須加載數(shù)據(jù)集中的每條記錄嘶卧,將其解析為字段尔觉,并提取名稱的數(shù)據(jù)。面向列的格式可以直接轉(zhuǎn)到 Name 列芥吟,因?yàn)樵摿械乃兄刀即鎯?chǔ)在一起侦铜。它不需要遍歷整個(gè)記錄。

因此钟鸵,面向列的格式提高了查詢性能钉稍,因?yàn)檗D(zhuǎn)到所需列所需的查找時(shí)間更少,并且由于只需要讀取需要數(shù)據(jù)的列棺耍,因此需要更少的 IO贡未。

Parquet文件格式

[圖片上傳失敗...(image-a510fc-1649317507854)]

Parquet 是 Hadoop 的一種開(kāi)源文件格式,以扁平列格式存儲(chǔ)嵌套數(shù)據(jù)結(jié)構(gòu)蒙袍。

Parquet文件格式優(yōu)點(diǎn)

  • 與以行方式存儲(chǔ)數(shù)據(jù)的傳統(tǒng)方法相比俊卤,Parquet文件格式在存儲(chǔ)和性能方面更高效。
  • 這對(duì)于從“寬”(具有許多列)表中讀取特定列的查詢特別有用害幅,因?yàn)橹蛔x取需要的列消恍,并且最小化 IO。
  • Parquet的獨(dú)特功能之一是它也可以以柱狀方式存儲(chǔ)具有嵌套結(jié)構(gòu)的數(shù)據(jù)以现。這意味著在 Parquet 文件格式中狠怨,即使是嵌套字段也可以單獨(dú)讀取,而無(wú)需讀取嵌套結(jié)構(gòu)中的所有字段邑遏。Parquet 格式使用記錄分解和組裝算法以柱狀方式存儲(chǔ)嵌套結(jié)構(gòu)佣赖。

[圖片上傳失敗...(image-c3759b-1649317507853)]

Parquet 文件格式結(jié)構(gòu)組成

[圖片上傳失敗...(image-41c9ac-1649317507854)]

  • Header: 包含一個(gè)幻數(shù)“PAR1”(4 字節(jié)),用于將文件標(biāo)識(shí)為 Parquet 格式文件无宿。

  • Row group(行組):將數(shù)據(jù)邏輯水平劃分為行茵汰。行組由數(shù)據(jù)集中每一列的列塊組成枢里。

  • Column chunk(列塊):特定列的數(shù)據(jù)塊孽鸡。這些列塊存在于特定的行組中蹂午,并保證在文件中是連續(xù)的。

  • Page(頁(yè)面):列塊被分成背靠背寫的頁(yè)面彬碱。這些頁(yè)面共享一個(gè)標(biāo)準(zhǔn)標(biāo)題豆胸,讀者可以跳過(guò)他們不感興趣的頁(yè)面。

  • Footer(頁(yè)腳):

  • 文件元數(shù)據(jù)- 文件元數(shù)據(jù)包含所有列元數(shù)據(jù)起始位置的位置巷疼。它還包括格式版本晚胡、架構(gòu)和任何額外的鍵值對(duì)。讀者應(yīng)該首先讀取文件元數(shù)據(jù)以找到他們感興趣的所有列塊嚼沿。然后應(yīng)該順序讀取列塊估盘。

  • 文件元數(shù)據(jù)的長(zhǎng)度(4 字節(jié))

  • 幻數(shù)“PAR1”(4 字節(jié))

ORC 文件格式

[圖片上傳失敗...(image-f37441-1649317507854)]

優(yōu)化行列式 ( ORC ) 文件格式提供了一種高效的數(shù)據(jù)存儲(chǔ)方式。 它旨在克服其他文件格式的限制骡尽。ORC 文件格式理想地存儲(chǔ)緊湊的數(shù)據(jù)遣妥,并允許跳過(guò)不相關(guān)的部分,而無(wú)需大型攀细、復(fù)雜或手動(dòng)維護(hù)的索引箫踩。ORC 文件格式解決了所有這些問(wèn)題。

ORC 文件格式優(yōu)點(diǎn)

  • 單個(gè)文件作為每個(gè)任務(wù)的輸出谭贪,減少 NameNode 的負(fù)載
  • Hive 類型支持境钟,包括 DateTime、decimal 和復(fù)雜類型(結(jié)構(gòu)俭识、列表慨削、映射和聯(lián)合)
  • 使用單獨(dú)的 RecordReader 并發(fā)讀取同一文件
  • ORC 文件格式能夠在不掃描標(biāo)記的情況下拆分文件
  • 根據(jù)文件頁(yè)腳中的信息估計(jì) Reader/Writer 的堆內(nèi)存分配上限
  • 使用協(xié)議緩沖區(qū)存儲(chǔ)的元數(shù)據(jù),允許添加和刪除字段

[圖片上傳失敗...(image-a34fff-1649317507854)]

ORC 文件格式將行集合存儲(chǔ)在一個(gè)文件中套媚,并且在集合中理盆,行數(shù)據(jù)以列格式存儲(chǔ)。

ORC 文件包含稱為stripe的行數(shù)據(jù)組和File footer(文件頁(yè)腳)中的輔助信息 凑阶。默認(rèn)stripe大小為 250 MB猿规。大stripe大小支持從 HDFS 進(jìn)行大量、高效的讀取宙橱。

ORC 文件格式結(jié)構(gòu)組成

  • **Index data(索引數(shù)據(jù)): **包括每列的最小值和最大值以及行在每列中的位置姨俩。ORC 索引僅用于stripe和行組的選擇,而不用于回答查詢师郑。

  • Row data(行數(shù)據(jù)):用于表掃描环葵。

  • stripe footer(頁(yè)腳):包含流位置的目錄。它還包含列級(jí)聚合計(jì)數(shù)宝冕、最小值张遭、最大值和總和。

  • File footer(文件頁(yè)腳):

  • 文件中的stripe列表地梨。

  • 每個(gè)stripe的行數(shù)菊卷。

  • 每列的數(shù)據(jù)類型缔恳。

  • Postscript:附有壓縮參數(shù)和壓縮頁(yè)腳的大小,在文件的末尾洁闰。

不同文件格式之間的比較

Avro 與 Parquet

  1. Avro是一種基于行的存儲(chǔ)格式歉甚,而 Parquet是一種基于列的存儲(chǔ)格式。
  2. Parquet 對(duì)于分析查詢要好得多扑眉,即讀取和查詢比寫入效率高得多纸泄。
  3. Avro中的編寫操作比Parquet 中的要好。
  4. 在模式演變方面腰素,Avro比 PARQUET 成熟得多聘裁。Parquet 僅支持模式追加,而 Avro支持功能強(qiáng)大的模式演變弓千,即添加或修改列咧虎。
  5. PARQUET 非常適合查詢多列表中的列子集。Avro是 ETL 操作的理想選擇计呈,我們需要查詢所有列砰诵。

ORC 與 Parquet

  1. Parquet更能存儲(chǔ)嵌套數(shù)據(jù)。
  2. ORC 更有能力進(jìn)行謂詞下推捌显。
  3. ORC 支持 ACID 屬性茁彭。
  4. ORC 的壓縮效率更高。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扶歪,一起剝皮案震驚了整個(gè)濱河市理肺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌善镰,老刑警劉巖妹萨,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異炫欺,居然都是意外死亡乎完,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門品洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)树姨,“玉大人,你說(shuō)我怎么就攤上這事桥状∶本荆” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵辅斟,是天一觀的道長(zhǎng)转晰。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么查邢? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任蔗崎,我火速辦了婚禮,結(jié)果婚禮上侠坎,老公的妹妹穿的比我還像新娘蚁趁。我一直安慰自己裙盾,他們只是感情好实胸,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著番官,像睡著了一般庐完。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徘熔,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天门躯,我揣著相機(jī)與錄音,去河邊找鬼酷师。 笑死讶凉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的山孔。 我是一名探鬼主播懂讯,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼台颠!你這毒婦竟也來(lái)了褐望?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤串前,失蹤者是張志新(化名)和其女友劉穎瘫里,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荡碾,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谨读,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坛吁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漆腌。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阶冈,靈堂內(nèi)的尸體忽然破棺而出闷尿,到底是詐尸還是另有隱情,我是刑警寧澤女坑,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布填具,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏劳景。R本人自食惡果不足惜誉简,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盟广。 院中可真熱鬧闷串,春花似錦、人聲如沸筋量。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桨武。三九已至肋拔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀酸,已是汗流浹背凉蜂。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留性誉,地道東北人窿吩。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像错览,于是被迫代替她去往敵國(guó)和親纫雁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容