【问题标题】:Spark: Avro vs Parquet performanceSpark:Avro 与 Parquet 的表现
【发布时间】:2019-05-03 10:57:17
【问题描述】:

现在 Spark 2.4 已经内置了对 Avro 格式的支持,我正在考虑更改我的数据湖中一些数据集的格式 - 通常查询/连接整行而不是特定列聚合的数据集 -从 Parquet 到 Avro。

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

【问题讨论】:

    标签: apache-spark avro parquet


    【解决方案1】:

    这两种格式在不同的约束下都有亮点,但它们都具有诸如具有模式的强类型和共同的二进制编码之类的东西。其基本形式归结为这种差异化:

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

    由于您已经调整好数据和摄取过程以编写 Parquet 文件,因此只要数据摄取(延迟)不会成为您的问题,您最好继续使用 Parquet。

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

    【讨论】:

    • 未作为问题的一部分提出,但提及 ORC 也可能有用
    • 那么 KUDU 呢?
    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2015-05-11
    • 2015-07-30
    • 2019-07-30
    • 2015-08-30
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多