Spark:Avro vs Parquet性能

use*_*850 0 avro apache-spark parquet

既然Spark 2.4内置了对Avro格式的支持,我正在考虑更改我的数据湖中某些数据集的格式-通常将这些数据集查询/合并为整个行,而不是特定的列聚合-从Parquet更改为阿夫罗

但是,数据之上的大部分工作都是通过Spark完成的,据我所知,Spark的内存中缓存和计算是在列格式的数据上完成的。Parquet是否在这方面提供性能提升,而Avro会带来某种形式的数据“转换”损失?在这方面,我还应注意其他哪些注意事项?

Uwe*_*orn 5

两种格式都有不同的约束,但是具有诸如带模式的强类型和通用的二进制编码之类的东西。它的基本形式归结为这种区别:

  • Avro是一种逐行格式。由此,您可以将行逐行追加到现有文件中。然后,这些文件的所有读者也可以立即看到这些按行追加。当您具有以流(非批处理)方式写入数据湖的进程时,Avro是最佳选择。
  • Parquet是一种柱状格式,其文件不可追加。这意味着对于新到达的记录,您必须始终创建新文件。作为这种行为的交换,实木复合地板带来了许多好处。数据以列形式存储,并且压缩和编码(简单的类型感知,低cpu但高效的压缩)应用于每列。因此,Parquet文件将比Avro文件小得多。Parquet还会写出基本统计信息,以便在从中加载数据时,可以将部分选择下推到I / O。然后,仅从磁盘加载必要的行集。由于Parquet已经采用柱状方式,并且大多数内存结构也将采用柱状,因此从它们中加载数据通常要快得多。

由于已经将您的数据和接收过程调整为写入Parquet文件,因此只要数据接收(等待时间)对您来说没有问题,最好还是保留Parquet。

实际上,典型的用法是将实木复合地板和Avro混合使用。最新的最新到达的数据存储为Avro文件,因为这使数据立即可用于数据湖。例如,每天将更多历史数据转换为Parquet文件,因为它们较小且加载效率最高,但只能成批写入。在处理这些数据时,您将两者作为两个表的联合加载到Spark中。因此,您可以受益于Parquet的高效读取以及Avro的即时数据可用性。这种模式通常被Netflix 发起的Uber的HudiApache Iceberg(孵化)等表格格式隐藏。