Apache Parquet 技術(shù)干貨分享

Parquet 是一種面向分析的传藏、通用的列式存儲(chǔ)格式腻暮,兼容各種數(shù)據(jù)處理框架比如 Spark、Hive毯侦、Impala 等,同時(shí)支持 Avro具垫、Thrift侈离、Protocol Buffers 等數(shù)據(jù)模型。

Parquet 作為 HDFS 存儲(chǔ)格式的事實(shí)標(biāo)準(zhǔn)筝蚕,經(jīng)常用在離線數(shù)倉卦碾、OLAP 等場(chǎng)景铺坞。本文整理于最近的一次公司內(nèi)訓(xùn),主要分四個(gè)部分:

1洲胖、Parquet 簡(jiǎn)介
2济榨、架構(gòu)解析
3、基本操作
4绿映、TPC-DS 基準(zhǔn)測(cè)試介紹

一擒滑、Parquet 簡(jiǎn)介

第一部分內(nèi)容介紹了此次 Parquet 分享的技術(shù)背景,行存與列存的區(qū)別叉弦,以及 Parquet 的特點(diǎn)丐一。

為什么要進(jìn)行這次 Parquet 講解?

主要因?yàn)?Parquet 在一個(gè)項(xiàng)目中重度使用淹冰,開發(fā)人員對(duì)其原理库车、操作不是很清楚,項(xiàng)目上是使用 Parquet 做離線數(shù)倉樱拴,計(jì)算層使用 Spark SQL 進(jìn)行離線分析構(gòu)建企業(yè)的標(biāo)簽系統(tǒng)柠衍,結(jié)果數(shù)據(jù)落地到 Elasticsearch。

Parquet可以說是一個(gè)列式存儲(chǔ)系統(tǒng)晶乔。關(guān)于行存與列存的區(qū)別可以簡(jiǎn)單用下圖描述拧略,列存在 IO 方面比行存有很大優(yōu)勢(shì),能夠減少掃描數(shù)據(jù)量瘪弓。

Parquet 的特點(diǎn)概況的說主要體現(xiàn)在:

  • 列裁剪與謂詞下推:列裁剪垫蛆,意思是只讀取需要的列,實(shí)現(xiàn)高效的列掃描腺怯,減少 IO 操作袱饭;謂詞下推,可以過濾掉不符合條件的數(shù)據(jù)呛占,只讀取需要的數(shù)據(jù)虑乖,進(jìn)一步減少 IO 操作。

  • 更高效的壓縮與編碼:因?yàn)橥涣械臄?shù)據(jù)類型相同晾虑,所以可以針對(duì)不同列使用更合適的壓縮與編碼方式疹味,降低磁盤存儲(chǔ)空間。

另外帜篇,Parquet也是Spark SQL 的默認(rèn)數(shù)據(jù)源糙捺,可通過參數(shù)spark.sql.sources.default 進(jìn)行配置。

二笙隙、架構(gòu)解析

1洪灯、技術(shù)架構(gòu)

Parquet 是 Apache 的頂級(jí)項(xiàng)目,整體技術(shù)架構(gòu)如下圖

Parquet 主要包含以下 5 個(gè)主要模塊:

  • parquet-format:定義了所有格式規(guī)范竟痰,以及由 Thrift 序列化的元數(shù)據(jù)信息等签钩。

  • parquet-mr:包括多個(gè)實(shí)現(xiàn)了讀寫 Parquet 文件的功能模塊掏呼,并且提供一些和其它組件適配的工具,例如Hadoop Input/Output Formats铅檩、Pig loaders憎夷、Hive Serde等。

  • parquet-cpp:用于讀寫 Parquet 文件的 C++ 庫昧旨。

  • parquet-rs:用于讀寫 Parquet 文件的 Rust 庫拾给。

  • parquet-compatibility:包含驗(yàn)證不同語言之間讀寫 Parquet 文件的兼容性測(cè)試等。

2臼予、數(shù)據(jù)模型

Parquet 是一種支持嵌套的數(shù)據(jù)模型鸣戴,和 Protocol Buffers 的數(shù)據(jù)模型類似,它的 schema 就是一個(gè)嵌套 message粘拾。

每個(gè) schema 包含多個(gè)字段窄锅,每一個(gè)字段又可以包含多個(gè)字段,每一個(gè)字段有三個(gè)屬性:repetition缰雇、type 和 name入偷,其中 repetiton 可以是以下三種:required(出現(xiàn)1次),repeated(出現(xiàn)0次或多次)械哟,optional(出現(xiàn)0次或1次)疏之。每一個(gè)字段的數(shù)據(jù)類型可以分成兩種:group(復(fù)雜類型)和 primitive(基本類型)。一個(gè)如下的 Parquet Schema 示意圖

如果用代碼表示就是:

message AddressBook  {    
  required string owner;    
  repeated string ownerPhoneNumbers;    
  repeated group contacts {          
      required string name;          
      optional string phoneNumber;    
  }
}

3暇咆、文件格式

下面是 Parquet 官網(wǎng)給出的文件格式圖解:

從如上文件結(jié)構(gòu)可以看出锋爪,Parquet 格式可以從以下幾個(gè)部分理解:

  • 文件(File):一個(gè) Parquet 文件,包括數(shù)據(jù)和元數(shù)據(jù)爸业,如果在 HDFS 之上其骄,數(shù)據(jù)就是分散存儲(chǔ)在多個(gè) HDFS Block 中。

  • 行組(Row Group):數(shù)據(jù)在水平方向上按行拆分為多個(gè)單元扯旷,每個(gè)單元就是所謂的 Row Group拯爽,即行組。這是一般列式存儲(chǔ)都會(huì)有的結(jié)構(gòu)設(shè)計(jì)钧忽。每一個(gè)行組包含一定的行數(shù)毯炮,Parquet 讀寫的時(shí)候會(huì)將整個(gè)行組緩存在內(nèi)存中,因此更大尺寸的行組將會(huì)占用更多的緩存耸黑,并且記錄占用空間比較小的 Schema 可以在每一個(gè)行組中存儲(chǔ)更多的行桃煎。

  • 列塊(Column Chunk):一個(gè)行組中的每一列對(duì)應(yīng)的保存在一個(gè)列塊中。行組中的所有列連續(xù)的存儲(chǔ)在這個(gè)行組文件中崎坊,每一個(gè)列塊中的值都是相同類型的备禀,不同列塊可能使用不同的算法進(jìn)行壓縮。

  • 數(shù)據(jù)頁(Data Page):每一個(gè)列塊劃分為多個(gè)數(shù)據(jù)頁或者說頁奈揍,一個(gè)頁是最小的編碼的單位曲尸,在同一個(gè)列塊的不同頁可能使用不同的編碼方式。

Parquet 文件有三種類型的元數(shù)據(jù)男翰,分別是file metadata另患、column(chunk) metadata、page header metadata蛾绎,每部分元數(shù)據(jù)包含的信息從上面圖解中大概可以得知昆箕。

此外,值得說明的是文件 header 部分中的 Magic Number租冠,它的作用主要是為了做文件校驗(yàn)鹏倘,驗(yàn)證文件是否是一個(gè)Parquet文件。

三顽爹、基本操作

1纤泵、通過 Hive 創(chuàng)建 Parquet 表

· 標(biāo)準(zhǔn)建表語句。舉一個(gè)最簡(jiǎn)單的建表示例镜粤,如下:

create table t1 (id int) stored as parquet;

· 通過 TextFile 表創(chuàng)建 Parquet 表捏题。這是離線數(shù)倉中的常規(guī)操作,假設(shè)已經(jīng)準(zhǔn)備好了一張 TextFile 表 catalog_sales肉渴,在 hive shell 命令行中演示如下操作:

-- 創(chuàng)建parquet表(不壓縮) 
> drop table if exists catalog_sales_par; 
> create table catalog_sales_par stored as parquet as select * from catalog_sales;

-- 設(shè)置parquet為snappy壓縮 
> set parquet.compression=SNAPPY; 
> create table catalog_sales_par_snappy stored as parquet as select * from catalog_sales;

-- 設(shè)置parquet塊大小  
> set parquet.block.size=268435456; 
> create table catalog_sales_par_snappy2 stored as parquet as select * from catalog_sales;

2公荧、查看 Parquet 文件 Schema

假如現(xiàn)在我們手上有一份 Parquet 文件,但是并沒有人告知我們它對(duì)應(yīng)的 schema 信息同规,這個(gè)時(shí)候怎么才能快速知道它的 schema 等信息呢循狰?

其實(shí) Parquet 原生提供了一個(gè)工具模塊,這個(gè)工具可以很方便的查看本地或 HDFS 上的 Parquet 文件信息券勺。不僅僅是 schema绪钥,還包括其他信息,按照下面使用方法中的幫助提示即可朱灿。

下載地址:
https://www.mvnjar.com/org.apache.parquet/parquet-tools/jar.html

使用方法:

#Run from Hadoop
hadoop jar ./parquet-tools-<VERSION>.jar --help
hadoop jar ./parquet-tools-<VERSION>.jar <command> my_parquet_file.par

#Run locally
java jar ./parquet-tools-<VERSION>.jar --help
java jar ./parquet-tools-<VERSION>.jar <command> my_parquet_file.par

實(shí)際測(cè)試:下載 parquet-tools-1.8.0.jar 工具包昧识,上傳到集群節(jié)點(diǎn)并讀取 HDFS 上的一個(gè) Parquet 文件:

四、TPC-DS 基準(zhǔn)測(cè)試介紹

TPC-DS 是標(biāo)準(zhǔn)的大數(shù)據(jù)基準(zhǔn)測(cè)試盗扒,采用星型跪楞、雪花型等多維數(shù)據(jù)模式,提供與真實(shí)數(shù)據(jù)一致的數(shù)倉數(shù)據(jù)以及符合實(shí)際的工作負(fù)載侣灶。提供的數(shù)據(jù)集包含 24 張表甸祭,其中 7 張事實(shí)表,17 張維度表褥影,平均每張表含有18列池户。事實(shí)表的表名分別是 catalog_returns、catalog_sales、inventory校焦、promotion赊抖、store_returns、store_sales寨典、web_returns氛雪、web_sales。工作負(fù)載包含 99 個(gè) SQL 查詢耸成,覆蓋SQL99 和 2003 的核心部分以及 OLAP报亩。

這里提前編譯好了一版 TPC-DS 包,并使用它在本地生成 10 GB 的樣本數(shù)據(jù)井氢,命令如下:

$cd ~/training/tpcds/v2.3.0/tools
$nohup ./dsdgen -scale 10 -dir ~/data_10g &

然后使用它提供的 Q20 簡(jiǎn)單測(cè)試一下 TextFile 與 Parquet 格式數(shù)據(jù)的查詢性能弦追。更多的性能測(cè)試這里不多描述了。

關(guān)注本微信公眾號(hào)花竞,后臺(tái)回復(fù) parq 獲取本文相關(guān)Parquet工具包與PPT劲件。

往期文章精選
Apache Hudi 0.5.1版本重磅發(fā)布
貝殼找房基于 Flink 的實(shí)時(shí)平臺(tái)建設(shè)
網(wǎng)易基于 HBase 的最佳實(shí)踐
小米流式平臺(tái)架構(gòu)演進(jìn)與實(shí)踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市左胞,隨后出現(xiàn)的幾起案子寇仓,更是在濱河造成了極大的恐慌,老刑警劉巖烤宙,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遍烦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡躺枕,警方通過查閱死者的電腦和手機(jī)服猪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拐云,“玉大人罢猪,你說我怎么就攤上這事〔娲瘢” “怎么了膳帕?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)薇缅。 經(jīng)常有香客問我危彩,道長(zhǎng),這世上最難降的妖魔是什么泳桦? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任汤徽,我火速辦了婚禮,結(jié)果婚禮上灸撰,老公的妹妹穿的比我還像新娘谒府。我一直安慰自己拼坎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布完疫。 她就那樣靜靜地躺著泰鸡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趋惨。 梳的紋絲不亂的頭發(fā)上鸟顺,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天惦蚊,我揣著相機(jī)與錄音器虾,去河邊找鬼。 笑死蹦锋,一個(gè)胖子當(dāng)著我的面吹牛兆沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莉掂,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼葛圃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了憎妙?” 一聲冷哼從身側(cè)響起库正,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厘唾,沒想到半個(gè)月后褥符,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抚垃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年喷楣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹤树。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铣焊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罕伯,到底是詐尸還是另有隱情曲伊,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布追他,位于F島的核電站坟募,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏湿酸。R本人自食惡果不足惜婿屹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望推溃。 院中可真熱鬧昂利,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扩所,卻和暖如春围详,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祖屏。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工助赞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袁勺。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓雹食,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親期丰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子群叶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351