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í)踐