大數(shù)據(jù)小視角2:ORCFile與Parquet裹虫,開(kāi)源圈背后的生意

上一篇文章聊了聊基于PAX的混合存儲(chǔ)結(jié)構(gòu)的RCFile肿嘲,其實(shí)這里筆者還了解一些八卦,RCfile的主力團(tuán)隊(duì)都是來(lái)自中科院的童鞋在Facebook完成的筑公,算是一個(gè)由華人主導(dǎo)的編碼項(xiàng)目雳窟。但是RCfile仍然存在一些缺陷,后續(xù)被HortonWorks盯上之后上馬了ORCFile格式匣屡,而老對(duì)頭Cloudera則緊抱Google大腿推出了Parquet格式封救。 其實(shí)二者需要解決的問(wèn)題是殊途同歸的际长,但是不同的爹似乎導(dǎo)致了不太相同的命運(yùn)。這篇文章兴泥,我們主要還是聊聊兩者的技術(shù)細(xì)節(jié),再穿插一些開(kāi)源圈的商業(yè)八卦~~~

1.ORCFile

Facebook在 2011年的 ICDE 會(huì)議之上發(fā)布了RCFile虾宇。之后RCFile在Hive之中作為很好的列存儲(chǔ)模型被廣泛使用搓彻,雖然RCFile能夠很好的提升Hive的工作性能,但是在Facebook論文之中也提出了一些RCFile值得改進(jìn)的地方嘱朽。所以在2013年旭贬,HortonWorks就在RCFile的基礎(chǔ)之上開(kāi)發(fā)出了ORCFile,并且ORCFlie很順利地在2015年成為Apache的頂級(jí)項(xiàng)目搪泳。接下來(lái)我們來(lái)看一看ORCFile相對(duì)于原本的RCFile解決了什么樣的問(wèn)題:

  • 列數(shù)據(jù)的類型感知:與RCFile之前對(duì)于列數(shù)據(jù)都統(tǒng)一為Blob數(shù)據(jù)不同稀轨,ORCFile可以感知列的數(shù)據(jù)類型,做出更為合理的數(shù)據(jù)壓縮選擇岸军。顯然奋刽,這樣可以節(jié)省不少存儲(chǔ)資源。(Facebook論文之中已經(jīng)提到這個(gè)思路了艰赞,但是發(fā)布論文的時(shí)候還沒(méi)有實(shí)現(xiàn)佣谐,屬于一個(gè)next to do的工作

  • 嵌套數(shù)據(jù)類型支持:ORCFile可以在列數(shù)據(jù)之中插入Struct,Union方妖,List狭魂,Map等數(shù)據(jù),讓數(shù)據(jù)的操作更加靈活党觅,也更加適合非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)與處理雌澄。

  • 謂詞下推:這個(gè)算是RCFile原先功能的補(bǔ)強(qiáng),在元數(shù)據(jù)層面增加了很多內(nèi)容杯瞻,來(lái)利用謂詞下推加速處理的過(guò)程镐牺。ORCFile自己稱之為輕量級(jí)索引,其實(shí)就是一些相較于RCFile更為詳細(xì)的統(tǒng)計(jì)數(shù)據(jù)魁莉。

存儲(chǔ)結(jié)構(gòu)

首先任柜,我們先來(lái)看看ORCFile的存儲(chǔ)結(jié)構(gòu)。如下圖所示沛厨,ORCFile完全拋棄了原有RCFile之中所謂Row Group的概念宙地。引入了三個(gè)新的組件,我們分別來(lái)看看對(duì)應(yīng)組件的內(nèi)容:


ORCFile的存儲(chǔ)結(jié)構(gòu)
  • (1) stripe:stripe是ORC文件的主體逆皮,還記的上文提到RCfile之中的Row Group的大小為4MB宅粥,而stripe的大小膨脹到了250MB。(果真還是越大越好么~~)至于為什么選擇250MB這個(gè)大小的用意也很明顯电谣,是為了與底層HDFS的塊大小契合秽梅,來(lái)減少M(fèi)apReduce處理時(shí)可能會(huì)帶來(lái)的通信損耗抹蚀。 stripe也分為具體三個(gè)部分:

    • Index Data:存儲(chǔ)每行的統(tǒng)計(jì)數(shù)據(jù),默認(rèn)是10000行的大小企垦。Index Data在Strip的最前面环壤,因它們只在使用謂詞向下推或讀者尋找特定行時(shí)加載。(這里主要利用的是統(tǒng)計(jì)信息與布隆過(guò)濾器實(shí)現(xiàn)的
    • Row Data:實(shí)際存儲(chǔ)數(shù)據(jù)的單元钞诡,利用列存原理郑现,對(duì)不同列可以實(shí)現(xiàn)不同壓縮方案,所有的列數(shù)據(jù)可以組成行數(shù)據(jù)荧降。
    • Stripe Footer:存儲(chǔ)了每個(gè)列的編碼與位置接箫。
  • (2) File Footer:部分包含Row data的布局、類型信息朵诫、行數(shù)和每個(gè)列的統(tǒng)計(jì)信息辛友。通過(guò)這塊可以篩選出需要讀取列的數(shù)據(jù)。至于類型消息剪返,假如有如下的表定義:

  create table Foobar (
    myInt int,
     myMap map<string,
     struct<myString : string,
     myDouble: double>>,
     myTime timestamp
);

則定義的類型是如同下圖的嵌套模式:


ORCFile的類型
  • (3) PostScript:這塊保存的內(nèi)容就是ORCFile的元數(shù)據(jù)了废累,包括了使用的壓縮類型,各個(gè)數(shù)據(jù)的長(zhǎng)度等脱盲。由于HDFS只支持Append的操作九默,所以,元數(shù)據(jù)放在文件的末尾是便于修改的宾毒。

上述就是ORCFile核心的存儲(chǔ)結(jié)構(gòu)了驼修。對(duì)比原先的RCFile,ORCFile沒(méi)有標(biāo)新立異的之處诈铛,只是補(bǔ)足了數(shù)據(jù)壓縮與數(shù)據(jù)處理的短板乙各。

2.Parquet

Google同樣在 2010年發(fā)布了最新交互處理的數(shù)據(jù)系統(tǒng)Dremel,并且在Dremel之上構(gòu)建了一個(gè)與Protocol Buffer兼容的數(shù)據(jù)模型幢竹《停基本上Google推出啥,開(kāi)源圈一定會(huì)照貓畫(huà)虎的弄一個(gè)出來(lái)焕毫。于是同樣在2013年蹲坷,ClouderaTwitter針對(duì)Dremel的數(shù)據(jù)模型為模板,推出了Parquet邑飒,Parquet同樣在2015年順利“畢業(yè)”循签,成為Apache的頂級(jí)項(xiàng)目。

其實(shí)Parquet與ORCFile像是孿生兄弟疙咸,許多設(shè)計(jì)的思路與細(xì)節(jié)是相同的县匠,都是列存儲(chǔ),數(shù)據(jù)壓縮那一套。所以這里筆者不展開(kāi)來(lái)講Parquet的技術(shù)細(xì)節(jié)了乞旦,而是結(jié)合Google的論文贼穆,來(lái)看一看Parquet與ORCFile最大的區(qū)別:數(shù)據(jù)模型

數(shù)據(jù)模型

為了兼容Protocol Buffer的嵌套結(jié)構(gòu)兰粉,Google的工程師設(shè)計(jì)了很精巧的模型來(lái)將Protocol Buffer的結(jié)構(gòu)落地到實(shí)際的存儲(chǔ)結(jié)構(gòu)之中故痊。坦白說(shuō),這或許是Google內(nèi)部為了兼容Protocol Buffer而實(shí)現(xiàn)的一個(gè)很trade off的設(shè)計(jì)玖姑,所以看起來(lái)有點(diǎn)奇怪:

Protocol Buffer的數(shù)據(jù)格式

如上圖所示愕秫,通過(guò)Protocol Buffer定義了一個(gè)組合類型Document,其中required字段是必須填寫(xiě)的客峭,optional字段是可以省略的,而repeated字段是可以重復(fù)的字段抡柿。其中I1與I2為示例數(shù)據(jù)舔琅。如何將上述的數(shù)據(jù)模型轉(zhuǎn)換為列存呢?我們接著往下看:

將嵌套字段切分之后變?yōu)榱写娴哪J?/div>

首先洲劣,將上述結(jié)構(gòu)之中每一個(gè)字段拆分出來(lái)备蚓,就可以變?yōu)榱写鎯?chǔ)的模式了。但是接下來(lái)的問(wèn)題在于如何處理非結(jié)構(gòu)化數(shù)據(jù)之中repeated與optional字段囱稽。這里是通過(guò)Repetition LevelDefinition Level才能來(lái)完整的還原數(shù)據(jù)的結(jié)構(gòu)郊尝。

  • Repetition Level:顧名思義,記錄了該列的值是在哪一個(gè)級(jí)別的字段上重復(fù)的战惊。
  • Definition Level:對(duì)于非NULL值并沒(méi)有什么意義流昏,因?yàn)榉荖ULL值Definition Level一定是相同的。(顯然是可以壓縮存儲(chǔ))記錄了該列的值是在哪一個(gè)級(jí)別上開(kāi)始作為NULL值存儲(chǔ)的吞获。

通過(guò)上述的兩個(gè)值况凉,便可以通過(guò)有限狀態(tài)機(jī)來(lái)還原Protocol Buffer格式所定義的數(shù)據(jù)結(jié)構(gòu),落地到實(shí)際的存儲(chǔ)之中各拷。(這里涉及到列存儲(chǔ)的跳轉(zhuǎn)刁绒,詳細(xì)的內(nèi)容可以參考Dremel論文的原文

上述Parquet的核心就在于:通過(guò)嵌套的數(shù)據(jù)模型設(shè)計(jì)來(lái)規(guī)避Join操作和掃描最少的列存儲(chǔ)。下圖是Parquet的數(shù)據(jù)模型烤黍,可以看出除了列存的模式之外知市,其余與ORCFile大同小異,筆者在這里就不進(jìn)贅述了:

Parquet的數(shù)據(jù)結(jié)構(gòu)

3.ORCfile與Parquet的比較

目前兩者都作為Apache的頂級(jí)項(xiàng)目來(lái)進(jìn)行維護(hù)速蕊,但是無(wú)論是設(shè)計(jì)的思路還是合理性都是ORCFile更為優(yōu)秀嫂丙。簡(jiǎn)單來(lái)說(shuō),對(duì)于OLAP的應(yīng)用规哲,本身就是需要通過(guò)ETL的流程進(jìn)行數(shù)據(jù)的格式復(fù)寫(xiě)奢入,對(duì)于Protocol Buffer的兼容的必要性這塊,筆者是存疑的。

但是或許是因?yàn)楸澈笏鲗?dǎo)的力量不同腥光,畢竟是出身名門关顷,在各個(gè)存儲(chǔ)系統(tǒng)的支持上,和實(shí)際的運(yùn)用之中武福,Parquet還是占了很大的優(yōu)勢(shì)议双。縱觀It產(chǎn)業(yè)的歷史發(fā)展,從來(lái)都不是因?yàn)榧夹g(shù)優(yōu)勢(shì)而能夠贏得賽跑的捉片。從ORCFile與Parquet目前在開(kāi)源上的不同境遇來(lái)看平痰,也符合兩家公司的在資本市場(chǎng)上的表現(xiàn)吧。

Hortonworks市值為13.63億美元
Cloudera市值為20.49億美元

但是無(wú)論商業(yè)競(jìng)逐上的勝利與失敗伍纫,能夠開(kāi)源好的技術(shù)來(lái)便利開(kāi)發(fā)者與使用者宗雇,應(yīng)該都是一件功德無(wú)量的事情。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莹规,一起剝皮案震驚了整個(gè)濱河市赔蒲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良漱,老刑警劉巖舞虱,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異母市,居然都是意外死亡矾兜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門患久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椅寺,“玉大人,你說(shuō)我怎么就攤上這事蒋失∨洳ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵高镐,是天一觀的道長(zhǎng)溉旋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嫉髓,這世上最難降的妖魔是什么观腊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮算行,結(jié)果婚禮上梧油,老公的妹妹穿的比我還像新娘。我一直安慰自己州邢,他們只是感情好儡陨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般骗村。 火紅的嫁衣襯著肌膚如雪嫌褪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天胚股,我揣著相機(jī)與錄音笼痛,去河邊找鬼。 笑死琅拌,一個(gè)胖子當(dāng)著我的面吹牛缨伊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播进宝,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刻坊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了党晋?” 一聲冷哼從身側(cè)響起谭胚,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隶校,沒(méi)想到半個(gè)月后漏益,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛹锰,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡深胳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铜犬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞终。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖癣猾,靈堂內(nèi)的尸體忽然破棺而出敛劝,到底是詐尸還是另有隱情,我是刑警寧澤纷宇,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布夸盟,位于F島的核電站,受9級(jí)特大地震影響像捶,放射性物質(zhì)發(fā)生泄漏上陕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一拓春、第九天 我趴在偏房一處隱蔽的房頂上張望释簿。 院中可真熱鬧,春花似錦硼莽、人聲如沸庶溶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)偏螺。三九已至行疏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砖茸,已是汗流浹背隘擎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凉夯,地道東北人货葬。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像劲够,于是被迫代替她去往敵國(guó)和親震桶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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