

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 调优 Spark 作业性能的策略
<a name="performance-tuning-strategies"></a>

准备优化参数时，请遵循以下最佳实践：
+ 应首先确定性能目标，然后再开始确定性能问题。
+ 应首先使用指标来确定问题，然后再尝试更改优化参数。

为确保在优化作业时获得稳定一致的结果，应为优化工作制定基线策略。

## 性能优化的基准策略
<a name="baseline"></a>

性能优化的工作流通常如下：

1. 确定性能目标。

1. 衡量指标。

1. 识别瓶颈。

1. 减少瓶颈的影响。

1. 重复第 2-4 步，直到达到预期目标为止。

首先，确定您的性能目标。例如，您的目标之一可能是在 3 小时内完成 AWS Glue 作业。定义目标后，衡量作业性能指标。识别指标的趋势和瓶颈以实现目标。特别是，识别瓶颈对于排查、调试和性能调优最为重要。在 Spark 应用程序运行期间，Spark 会在 Spark 事件日志中记录每个任务的状态和统计信息。

在中 AWS Glue，你可以通过 Spark 历史服务器提供的 [Spark Web 用户界面](https://spark.apache.org/docs/latest/web-ui.html)查看 Spark 指标。 AWS Glue for Spark 任务可以将 [Spark 事件日志](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html)发送到你在 Amazon S3 中指定的位置。 AWS Glue 还提供了一个示例[AWS CloudFormation 模板](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html#monitor-spark-ui-history-cfn)和 [Dockerfile](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html#monitor-spark-ui-history-local)，用于在 Amazon EC2 实例或您的本地计算机上启动 Spark 历史服务器，因此您可以将 Spark 用户界面与事件日志一起使用。

在确定性能目标并明确评测这些目标的指标后，您可以使用以下各节中的策略开始识别和修复瓶颈。

## Spark 作业性能的调优实践
<a name="tuning-practices"></a>

您可以使用以下策略对 Spark 作业 AWS Glue 进行性能优化：
+ AWS Glue 资源：
  + [扩展集群容量](scale-cluster-capacity.md)
  + [使用最新的 AWS Glue 版本](latest-version.md)
+ Spark 应用程序：
  + [减少数据扫描量](reduce-data-scan.md)
  + [并行处理任务](parallelize-tasks.md)
  + [优化随机排序](optimize-shuffles.md)
  + [最大限度减少规划开销](minimize-planning-overhead.md)
  + [优化用户定义的函数](optimize-user-defined-functions.md)

在使用这些策略之前，您必须能够访问 Spark 作业的指标和配置。您可以在 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/etl-jobs-section.html)中找到这些信息。

从 AWS Glue 资源的角度来看，您可以通过添加 AWS Glue 工作人员和使用最新 AWS Glue 版本来提高性能。

从 Apache Spark 应用程序视角来看，您可以访问几种能够提升性能的策略。如果将不必要的数据加载到 Spark 集群中，则可以将其移除以减少加载的数据量。如果您的 Spark 集群资源未得到充分利用，并且数据较少 I/O，则可以确定要并行处理的任务。如果联接等繁重的数据传输操作需要大量时间，则可能还需要对其进行优化。您还可以优化作业查询计划或降低单个 Spark 作业的计算复杂性。

要高效地应用这些策略，您必须通过查阅指标来确定其何时适用。有关更多详细信息，请参阅以下各节。这些技术不仅适用于性能调优，而且可用于解决内存不足（OOM）错误等典型问题。