Hadoop三种文件存储格式Avro、Parquet、ORC

也是知识,要了解

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

为什么我们需要不同的文件格式?

对于 MapReduce 和 Spark 等支持 HDFS 的应用程序来说,一个巨大的瓶颈是在特定位置查找相关数据所需的时间以及将数据写回另一个位置所需的时间。这些问题随着管理大型数据集的困难而变得复杂,例如不断发展的模式或存储限制。

在处理大数据时,存储此类数据所需的成本更高(Hadoop 冗余存储数据以实现容错)。除了存储成本之外,处理数据还伴随着 CPU、网络、IO 成本等。随着数据的增加,处理和存储的成本也随之增加。

各种 Hadoop 文件格式在 数据工程解决方案中得到了发展,以缓解许多用例中的这些问题。

选择合适的文件格式可以带来一些显着的好处:

  1. 更快的读取时间
  2. 更快的写入时间
  3. 可拆分文件
  4. 模式演变支持
  5. 高级压缩支持

一些文件格式是为一般用途而设计的,另一些是为更具体的用例而设计的,还有一些是为特定数据特征而设计的。所以有相当多的选择。

Avro 文件格式

[图片上传失败...(image-1ec66-1649317507854)]

Avro 格式是 Hadoop 的一种基于行的存储格式,被广泛用作序列化平台。

Avro 格式以 JSON 格式存储模式,使其易于被任何程序读取和解释。

数据本身以二进制格式存储,使其在 Avro 文件中紧凑且高效。

vro格式是语言中立的数据序列化系统。它可以被多种语言处理(目前是 C、C++、C#、Java、Python 和 Ruby)。

Avro 格式的一个关键特性 是对随时间变化的数据模式的强大支持,即模式演变。Avro 处理模式更改,例如缺少字段、添加的字段和更改的字段。

Avro 格式提供了丰富的数据结构。例如,您可以创建包含数组、枚举类型和子记录的记录。

[图片上传失败...(image-aa93b7-1649317507854)]

Avro 格式是在数据湖登陆区存储数据的理想选择,因为:

1.落地区的数据通常被整体读取,以供下游系统进一步处理(这种情况下基于行的格式效率更高)。

2. 下游系统可以轻松地从 Avro 文件中检索表模式(无需将模式单独存储在外部元存储中)。

3. 任何源模式更改都很容易处理(模式演变)。

列式存储格式

为了更好地理解 Hadoop 中的 Parquet 和ORC 文件格式,首先我们来看看什么是列式存储格式。在面向列的格式中,记录中相同类型的每一列的值存储在一起。

例如 ,如果有一条记录包含 ID、员工姓名和部门,则 ID 列的所有值将存储在一起,Name 列的值将存储在一起,等等。如果我们采用与上述相同的记录模式,具有三个字段 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);">添加图片注释,不超过 140 字(可选)</figcaption>

对于此表,按行存储格式的数据将按如下方式存储:

[图片上传失败...(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);">添加图片注释,不超过 140 字(可选)</figcaption>

然而,面向列的存储格式中的相同数据将如下所示:

[图片上传失败...(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);">添加图片注释,不超过 140 字(可选)</figcaption>

当您需要从表中查询几列时,列式存储格式更有效。它将只读取所需的列,因为它们是相邻的,从而最小化 IO。

例如,假设您只需要 NAME列。 在行存储格式中,必须加载数据集中的每条记录,将其解析为字段,并提取名称的数据。面向列的格式可以直接转到 Name 列,因为该列的所有值都存储在一起。它不需要遍历整个记录。

因此,面向列的格式提高了查询性能,因为转到所需列所需的查找时间更少,并且由于只需要读取需要数据的列,因此需要更少的 IO。

Parquet文件格式

[图片上传失败...(image-a510fc-1649317507854)]

Parquet 是 Hadoop 的一种开源文件格式,以扁平列格式存储嵌套数据结构。

Parquet文件格式优点

  • 与以行方式存储数据的传统方法相比,Parquet文件格式在存储和性能方面更高效。
  • 这对于从“宽”(具有许多列)表中读取特定列的查询特别有用,因为只读取需要的列,并且最小化 IO。
  • Parquet的独特功能之一是它也可以以柱状方式存储具有嵌套结构的数据。这意味着在 Parquet 文件格式中,即使是嵌套字段也可以单独读取,而无需读取嵌套结构中的所有字段。Parquet 格式使用记录分解和组装算法以柱状方式存储嵌套结构。

[图片上传失败...(image-c3759b-1649317507853)]

Parquet 文件格式结构组成

[图片上传失败...(image-41c9ac-1649317507854)]

  • Header: 包含一个幻数“PAR1”(4 字节),用于将文件标识为 Parquet 格式文件。

  • Row group(行组):将数据逻辑水平划分为行。行组由数据集中每一列的列块组成。

  • Column chunk(列块):特定列的数据块。这些列块存在于特定的行组中,并保证在文件中是连续的。

  • Page(页面):列块被分成背靠背写的页面。这些页面共享一个标准标题,读者可以跳过他们不感兴趣的页面。

  • Footer(页脚):

  • 文件元数据- 文件元数据包含所有列元数据起始位置的位置。它还包括格式版本、架构和任何额外的键值对。读者应该首先读取文件元数据以找到他们感兴趣的所有列块。然后应该顺序读取列块。

  • 文件元数据的长度(4 字节)

  • 幻数“PAR1”(4 字节)

ORC 文件格式

[图片上传失败...(image-f37441-1649317507854)]

优化行列式 ( ORC ) 文件格式提供了一种高效的数据存储方式。 它旨在克服其他文件格式的限制。ORC 文件格式理想地存储紧凑的数据,并允许跳过不相关的部分,而无需大型、复杂或手动维护的索引。ORC 文件格式解决了所有这些问题。

ORC 文件格式优点

  • 单个文件作为每个任务的输出,减少 NameNode 的负载
  • Hive 类型支持,包括 DateTime、decimal 和复杂类型(结构、列表、映射和联合)
  • 使用单独的 RecordReader 并发读取同一文件
  • ORC 文件格式能够在不扫描标记的情况下拆分文件
  • 根据文件页脚中的信息估计 Reader/Writer 的堆内存分配上限
  • 使用协议缓冲区存储的元数据,允许添加和删除字段

[图片上传失败...(image-a34fff-1649317507854)]

ORC 文件格式将行集合存储在一个文件中,并且在集合中,行数据以列格式存储。

ORC 文件包含称为stripe的行数据组和File footer(文件页脚)中的辅助信息 。默认stripe大小为 250 MB。大stripe大小支持从 HDFS 进行大量、高效的读取。

ORC 文件格式结构组成

  • **Index data(索引数据): **包括每列的最小值和最大值以及行在每列中的位置。ORC 索引仅用于stripe和行组的选择,而不用于回答查询。

  • Row data(行数据):用于表扫描。

  • stripe footer(页脚):包含流位置的目录。它还包含列级聚合计数、最小值、最大值和总和。

  • File footer(文件页脚):

  • 文件中的stripe列表。

  • 每个stripe的行数。

  • 每列的数据类型。

  • Postscript:附有压缩参数和压缩页脚的大小,在文件的末尾。

不同文件格式之间的比较

Avro 与 Parquet

  1. Avro是一种基于行的存储格式,而 Parquet是一种基于列的存储格式。
  2. Parquet 对于分析查询要好得多,即读取和查询比写入效率高得多。
  3. Avro中的编写操作比Parquet 中的要好。
  4. 在模式演变方面,Avro比 PARQUET 成熟得多。Parquet 仅支持模式追加,而 Avro支持功能强大的模式演变,即添加或修改列。
  5. PARQUET 非常适合查询多列表中的列子集。Avro是 ETL 操作的理想选择,我们需要查询所有列。

ORC 与 Parquet

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

推荐阅读更多精彩内容