Spark:Avro与Parquet性能比较

6
现在,由于Spark 2.4内置支持Avro格式,我正在考虑将数据湖中一些通常查询/连接整行而不是特定列聚合的数据集的格式从Parquet更改为Avro。然而,大部分对数据的操作都是通过Spark进行的,据我了解,Spark的内存缓存和计算是基于列格式化的数据完成的。在这方面,Parquet是否提供了性能提升,而Avro则会产生某种形式的数据“转换”惩罚?在这方面,还有哪些其他方面的考虑需要注意?
1个回答

11

这两种格式在不同的限制条件下表现出色,但具有强类型和模式以及二进制编码等共同点。就其基本形式而言,它可以归结为以下区别:

  • Avro 是一种行格式。由此可知,您可以将新行附加到现有文件中。这些行附加操作对所有读取这些文件的读者也立即可见。当您拥有一个以流(非批量)方式写入数据湖的过程时,Avro表现最佳。
  • Parquet 是一种列格式,其文件无法追加。这意味着,对于新到达的记录,您必须始终创建新文件。作为交换,Parquet 带来了几个好处。数据以列的方式存储,并对每个列应用压缩和编码(简单的类型感知、低cpu但高效的压缩)。因此,Parquet 文件比 Avro 文件要小得多。此外,Parquet 还会输出基本统计信息,当您从中加载数据时,您可以将选择的部分推送到 I/O。然后只加载磁盘上必要的行集。由于 Parquet 已经是一种列格式,并且大多数内存结构也将是列格式,因此从它们中加载数据通常会快得多。

如果您已经有了数据并且调整了摄取过程以编写Parquet文件,则在数据摄取(延迟)不成为问题之前,最好仍然使用Parquet。

典型用法实际上是将Parquet和Avro混合使用。最近到达的新数据存储为Avro文件,因为这使得数据立即可用于数据湖。更历史悠久的数据则根据需要(例如每天)转换为Parquet文件,因为它们更小,加载最高效,但只能按批次写入。在处理此数据时,您将其作为两个表的联合加载到Spark中。因此,您可以在Parquet的高效读取与Avro的即时数据可用性之间获得利益。这种模式通常由像 Uber's HudiApache Iceberg (incubating) 这样的表格式隐藏。


1
将以下与程序设计相关的内容从英语翻译成中文。仅返回翻译后的文本:虽然这不是问题的一部分,但提到ORC也可能很有用。 - OneCricketeer
那么KUDU呢? - thebluephantom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接