Apache Parquet 技术干货分享

Parquet 是一种面向分析的、通用的列式存储格式,兼容各种数据处理框架比如 Spark、Hive、Impala 等,同时支持 Avro、Thrift、Protocol Buffers 等数据模型。

Parquet 作为 HDFS 存储格式的事实标准,经常用在离线数仓、OLAP 等场景。本文整理于最近的一次公司内训,主要分四个部分:

1、Parquet 简介
2、架构解析
3、基本操作
4、TPC-DS 基准测试介绍

一、Parquet 简介

第一部分内容介绍了此次 Parquet 分享的技术背景,行存与列存的区别,以及 Parquet 的特点。

为什么要进行这次 Parquet 讲解?

主要因为 Parquet 在一个项目中重度使用,开发人员对其原理、操作不是很清楚,项目上是使用 Parquet 做离线数仓,计算层使用 Spark SQL 进行离线分析构建企业的标签系统,结果数据落地到 Elasticsearch。

Parquet可以说是一个列式存储系统。关于行存与列存的区别可以简单用下图描述,列存在 IO 方面比行存有很大优势,能够减少扫描数据量。

Parquet 的特点概况的说主要体现在:

  • 列裁剪与谓词下推:列裁剪,意思是只读取需要的列,实现高效的列扫描,减少 IO 操作;谓词下推,可以过滤掉不符合条件的数据,只读取需要的数据,进一步减少 IO 操作。

  • 更高效的压缩与编码:因为同一列的数据类型相同,所以可以针对不同列使用更合适的压缩与编码方式,降低磁盘存储空间。

另外,Parquet也是Spark SQL 的默认数据源,可通过参数spark.sql.sources.default 进行配置。

二、架构解析

1、技术架构

Parquet 是 Apache 的顶级项目,整体技术架构如下图

Parquet 主要包含以下 5 个主要模块:

  • parquet-format:定义了所有格式规范,以及由 Thrift 序列化的元数据信息等。

  • parquet-mr:包括多个实现了读写 Parquet 文件的功能模块,并且提供一些和其它组件适配的工具,例如Hadoop Input/Output Formats、Pig loaders、Hive Serde等。

  • parquet-cpp:用于读写 Parquet 文件的 C++ 库。

  • parquet-rs:用于读写 Parquet 文件的 Rust 库。

  • parquet-compatibility:包含验证不同语言之间读写 Parquet 文件的兼容性测试等。

2、数据模型

Parquet 是一种支持嵌套的数据模型,和 Protocol Buffers 的数据模型类似,它的 schema 就是一个嵌套 message。

每个 schema 包含多个字段,每一个字段又可以包含多个字段,每一个字段有三个属性:repetition、type 和 name,其中 repetiton 可以是以下三种:required(出现1次),repeated(出现0次或多次),optional(出现0次或1次)。每一个字段的数据类型可以分成两种:group(复杂类型)和 primitive(基本类型)。一个如下的 Parquet Schema 示意图

如果用代码表示就是:

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

3、文件格式

下面是 Parquet 官网给出的文件格式图解:

从如上文件结构可以看出,Parquet 格式可以从以下几个部分理解:

  • 文件(File):一个 Parquet 文件,包括数据和元数据,如果在 HDFS 之上,数据就是分散存储在多个 HDFS Block 中。

  • 行组(Row Group):数据在水平方向上按行拆分为多个单元,每个单元就是所谓的 Row Group,即行组。这是一般列式存储都会有的结构设计。每一个行组包含一定的行数,Parquet 读写的时候会将整个行组缓存在内存中,因此更大尺寸的行组将会占用更多的缓存,并且记录占用空间比较小的 Schema 可以在每一个行组中存储更多的行。

  • 列块(Column Chunk):一个行组中的每一列对应的保存在一个列块中。行组中的所有列连续的存储在这个行组文件中,每一个列块中的值都是相同类型的,不同列块可能使用不同的算法进行压缩。

  • 数据页(Data Page):每一个列块划分为多个数据页或者说页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

Parquet 文件有三种类型的元数据,分别是file metadata、column(chunk) metadata、page header metadata,每部分元数据包含的信息从上面图解中大概可以得知。

此外,值得说明的是文件 header 部分中的 Magic Number,它的作用主要是为了做文件校验,验证文件是否是一个Parquet文件。

三、基本操作

1、通过 Hive 创建 Parquet 表

· 标准建表语句。举一个最简单的建表示例,如下:

create table t1 (id int) stored as parquet;

· 通过 TextFile 表创建 Parquet 表。这是离线数仓中的常规操作,假设已经准备好了一张 TextFile 表 catalog_sales,在 hive shell 命令行中演示如下操作:

-- 创建parquet表(不压缩) 
> drop table if exists catalog_sales_par; 
> create table catalog_sales_par stored as parquet as select * from catalog_sales;

-- 设置parquet为snappy压缩 
> set parquet.compression=SNAPPY; 
> create table catalog_sales_par_snappy stored as parquet as select * from catalog_sales;

-- 设置parquet块大小  
> set parquet.block.size=268435456; 
> create table catalog_sales_par_snappy2 stored as parquet as select * from catalog_sales;

2、查看 Parquet 文件 Schema

假如现在我们手上有一份 Parquet 文件,但是并没有人告知我们它对应的 schema 信息,这个时候怎么才能快速知道它的 schema 等信息呢?

其实 Parquet 原生提供了一个工具模块,这个工具可以很方便的查看本地或 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

实际测试:下载 parquet-tools-1.8.0.jar 工具包,上传到集群节点并读取 HDFS 上的一个 Parquet 文件:

四、TPC-DS 基准测试介绍

TPC-DS 是标准的大数据基准测试,采用星型、雪花型等多维数据模式,提供与真实数据一致的数仓数据以及符合实际的工作负载。提供的数据集包含 24 张表,其中 7 张事实表,17 张维度表,平均每张表含有18列。事实表的表名分别是 catalog_returns、catalog_sales、inventory、promotion、store_returns、store_sales、web_returns、web_sales。工作负载包含 99 个 SQL 查询,覆盖SQL99 和 2003 的核心部分以及 OLAP。

这里提前编译好了一版 TPC-DS 包,并使用它在本地生成 10 GB 的样本数据,命令如下:

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

然后使用它提供的 Q20 简单测试一下 TextFile 与 Parquet 格式数据的查询性能。更多的性能测试这里不多描述了。

关注本微信公众号,后台回复 parq 获取本文相关Parquet工具包与PPT。

往期文章精选
Apache Hudi 0.5.1版本重磅发布
贝壳找房基于 Flink 的实时平台建设
网易基于 HBase 的最佳实践
小米流式平台架构演进与实践

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352