你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文讨论优化数据存储的策略,以便在 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要求在程序中注册类,并且尚不支持所有可序列化类型。
使用存储桶
存储桶类似于数据分区。 但每个存储桶可以保存一组列值,而不仅仅是一个列值。 此方法适用于对大量(以数百万或更多)值(如产品标识符)进行分区。 存储桶是通过对行的存储桶键进行哈希计算来确定的。 分桶表提供独特的优化,因为它们存储了关于如何分桶和排序的元数据。
一些高级存储桶功能包括:
- 基于存储桶元信息的查询优化。
- 优化的聚合。
- 优化的联接。
可以同时使用分区和存储桶。