通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Apache Spark 的数据存储优化

本文讨论优化数据存储的策略,以便在 Azure HDInsight 上高效执行 Apache Spark 作业。

概述

Spark 支持多种格式,例如 csv、json、xml、parquet、orc 和 avro。 可以扩展 Spark 以支持使用外部数据源的更多格式 - 有关详细信息,请参阅 Apache Spark 包

在性能方面最佳的数据格式是 具有 snappy 压缩的 parquet,是 Spark 2.x 中的默认值。 Parquet 以列式格式存储数据,并在 Spark 中高度优化。

选择数据抽象

早期版本的 Spark 使用 RDD 分别提取数据、Spark 1.3 和 1.6 引入的数据帧和数据集。 请考虑以下相对优点:

  • 数据帧
    • 在大多数情况下,最佳选择。
    • 通过 Catalyst 提供查询优化。
    • 全阶段代码生成。
    • 直接内存访问。
    • 垃圾回收(GC)开销低。
    • 不如数据集那样对开发者友好,因为没有编译时检查和领域对象编程。
  • DataSet
    • 在复杂的 ETL 管道中,性能影响在可接受范围内。
    • 在性能影响可能会很大的聚合中表现不佳。
    • 通过 Catalyst 提供查询优化。
    • 由于提供领域对象编程和编译时检查,系统对开发人员更为友好。
    • 添加序列化/反序列化开销。
    • 较高的 GC 开销。
    • 中断整个阶段代码生成。
  • RDDs
    • 无需使用 RDD,除非需要生成新的自定义 RDD。
    • 没有通过 Catalyst 进行查询优化。
    • 没有全阶段代码生成。
    • 高 GC 开销。
    • 必须使用 Spark 1.x 旧版 API。

选择默认存储

创建新的 Spark 群集时,可以选择 Azure Blob 存储或 Azure Data Lake Storage 作为群集的默认存储。 这两个选项都为暂时性群集提供长期存储的优势。 因此,删除群集时,数据不会自动删除。 可以重新创建暂时性群集,但仍可访问数据。

存储类型 文件系统 速度 Transient 用例
Azure Blob 存储 wasb://url/ 标准 是的 临时群集
Azure Blob 存储(安全) wasbs://url/ 标准 是的 临时群集
Azure Data Lake Storage Gen 2 abfs://url/ 更快 是的 临时集群
Azure Data Lake Storage Gen 1 adl://url/ 更快 是的 临时集群
本地 HDFS hdfs://url/ 最快 交互式 24/7 群集

有关存储选项的完整说明,请参阅 比较用于 Azure HDInsight 群集的存储选项

使用缓存

Spark 提供自己的本机缓存机制,这些机制可以通过不同的方法(例如 .persist().cache()CACHE TABLE)使用。 在小型数据集和需要缓存中间结果的 ETL 管道中,此本机缓存非常有效。 但是,Spark 本机缓存当前不适用于分区,因为缓存表不会保留分区数据。 更通用可靠的缓存技术是 存储层缓存

  • 本机 Spark 缓存(不建议)

    • 适用于小型数据集。
    • 不适用于分区,这可能会在未来的 Spark 版本中发生变化。
  • 存储级别缓存(建议)

    • 可以使用 IO 缓存 功能在 HDInsight 上实现。
    • 使用内存中和 SSD 缓存。
  • 本地 HDFS(推荐)

    • hdfs://mycluster 路径。
    • 使用 SSD 缓存。
    • 删除群集时,缓存数据将丢失,需要重新生成缓存。

优化数据序列化

Spark 作业是分布式的,因此适当的数据序列化对于最佳性能非常重要。 Spark 有两个序列化选项:

  • Java 序列化是默认值。
  • Kryo 序列化是一种较新的格式,与 Java 相比,序列化可以更快、更紧凑。 Kryo 要求在程序中注册类,并且尚不支持所有可序列化类型。

使用存储桶

存储桶类似于数据分区。 但每个存储桶可以保存一组列值,而不仅仅是一个列值。 此方法适用于对大量(以数百万或更多)值(如产品标识符)进行分区。 存储桶是通过对行的存储桶键进行哈希计算来确定的。 分桶表提供独特的优化,因为它们存储了关于如何分桶和排序的元数据。

一些高级存储桶功能包括:

  • 基于存储桶元信息的查询优化。
  • 优化的聚合。
  • 优化的联接。

可以同时使用分区和存储桶。

后续步骤