本文档介绍了 Managed Service for Apache Spark 自动扩缩功能。 当您提交 Spark 工作负载时,Managed Service for Apache Spark 可以动态扩缩工作负载资源(例如执行程序的数量),以便高效地运行工作负载。Managed Service for Apache Spark 自动扩缩是 默认行为,它使用 Spark 动态资源分配 来确定是否扩缩工作负载、如何扩缩工作负载以及何时扩缩工作负载。
Managed Service for Apache Spark 自动扩缩 V2
Managed Service for Apache Spark 自动扩缩版本 2 (V2) 在默认版本 1 (V1) 的基础上添加了功能和改进,可帮助您管理 Managed Service for Apache Spark 工作负载、提高工作负载性能并节省费用:
- 异步节点缩容:自动扩缩 V2 将 V1 的同步 缩容替换为异步缩容。使用异步缩容时,Managed Service for Apache Spark 会缩容工作负载资源,而无需等待所有节点完成混洗迁移。这意味着,缩容速度较慢的长尾节点不会阻止扩容。
- 智能缩容节点选择:自动伸缩 V2 将 V1 的 随机节点选择替换为智能算法,该算法可识别最适合先缩容的 节点。此算法会考虑节点的混洗数据大小和空闲时间等因素。
- 可配置的 Spark 优雅退役和混洗迁移行为: 自动扩缩 V2 可让您使用标准 Spark 属性来配置 Spark 优雅 退役和混洗迁移。此功能可帮助您保持与自定义 Spark 属性的迁移兼容性。
Managed Service for Apache Spark 自动扩缩功能
| 功能 | Managed Service for Apache Spark 自动扩缩 V1 | Managed Service for Apache Spark 自动扩缩 V2 |
| 节点缩容 | 同步 | 异步 |
| 用于缩容的节点选择 | 随机 | 智能 |
| Spark 安全停用和混洗迁移 | 不可配置 | 可配置 |
Spark 动态分配属性
下表列出了 Spark 动态分配 属性,您可以在提交批处理工作负载时设置这些属性来控制自动扩缩(请参阅 如何设置 Spark 属性)。
| 属性 | 说明 | 默认 |
|---|---|---|
spark.dataproc.scaling.version |
Managed Service for Apache Spark 自动扩缩版本。指定版本 1 或 2。 |
1 |
spark.dynamicAllocation.enabled |
是否使用动态资源分配,该分配会根据工作负载扩缩执行程序的数量。
将值设置为 false 会停用工作负载的自动扩缩
。默认值:true。 |
true |
spark.dynamicAllocation.initialExecutors |
分配给工作负载的执行程序的初始数量。工作负载启动后,自动扩缩可能会更改活跃执行程序的数量。最小值为 2;最大值为 2000。 |
2 |
spark.dynamicAllocation.minExecutors |
工作负载可以缩容到的最小执行程序数量。
最小值为 2。 |
2 |
spark.dynamicAllocation.maxExecutors |
工作负载可以扩容到的最大执行程序数量。
最大值为 2000。 |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
自定义 Spark 工作负载的扩容。接受的值介于
0 到 1 之间。值为 1.0
时,可提供最大的扩容能力,并有助于实现最大
并行度。值为 0.5 时,扩容能力和
并行度为最大值的一半。 |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
如果为 true,则当运行的执行程序超出 spark.dynamicAllocation.diagnosis.interval 指定的时间段内所需的最大执行程序数量时,系统会记录诊断信息。诊断信息包括执行程序摘要,其中包含空闲执行程序计数和空闲时间
百分位数、活跃任务分配、混洗数据大小和缓存的 RDD 大小。
使用 spark.dynamicAllocation.diagnosis.logLevel 控制输出日志级别。 |
false |
spark.dynamicAllocation.profile |
设置为 performance 或 cost,以应用针对性能或性价比进行优化的预定义配置集。用户定义的属性会替换配置文件的默认值。如需了解详情,请参阅
Spark 动态分配配置文件。 |
none |
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled |
如果为 true,则为保存混洗数据的执行程序启用动态超时计算。
超时时间不是使用静态 spark.dynamicAllocation.shuffleTracking.timeout,
而是根据执行程序上存储的混洗数据量计算得出。
这样,混洗数据较少的执行程序可以更快释放,而混洗数据较多的执行程序可以保持更长时间的活跃状态。 |
false |
spark.reducer.fetchMigratedShuffle.enabled |
如果设置为 true,则在因 Spark 动态分配而退役的执行程序提取失败后,从 Spark 驱动程序提取混洗输出
位置。这样可以减少因混洗块从退役的执行程序迁移到活跃的执行程序而导致的
ExecutorDeadException 错误,并减少因 FetchFailedException
错误而导致的阶段重试(请参阅
由
ExecutorDeadException 引起的 FetchFailedException)。
此属性在 Managed Service for Apache Spark
Spark 运行时
版本
1.1.12 及更高版本和 2.0.20 及更高版本中提供。 |
false |
spark.scheduler.excludeShuffleSkewExecutors |
如果为 true,则避免在混洗倾斜的执行程序上调度任务,这些执行程序具有大量混洗数据或大量已完成的映射任务。这可以通过缓解混洗倾斜来提高性能。 |
false |
Spark 动态分配配置文件
您可以将 spark.dynamicAllocation.profile 属性设置为 performance 或 cost,以应用针对性能或性价比进行优化的预定义 Spark 配置集。如果您除了设置 spark.dynamicAllocation.profile 属性之外还设置了 Spark 属性,则您的设置将替换这些属性的配置文件的默认值。
**performance**:此配置文件通过应用以下默认设置来优化,以实现最短的执行时间:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost:此配置文件通过应用以下默认设置来优化,以减少资源消耗:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
Spark 动态分配指标
Spark 批处理工作负载会生成以下与 Spark 动态 资源分配相关的指标(如需详细了解 Spark 指标,请参阅 监控和检测)。
| 指标 | 说明 |
|---|---|
maximum-needed |
在当前负载下满足 所有正在运行和待处理任务所需的最大执行程序数量。 |
running |
正在执行任务的执行程序的数量。 |
Spark 动态分配问题和解决方案
由 ExecutorDeadException 引起的 FetchFailedException
原因:当 Spark 动态分配缩容执行程序时,混洗文件会迁移到活跃的执行程序。但是,由于执行程序上的 Spark reducer 任务在 reducer 任务启动时从 Spark 驱动程序设置的位置提取混洗输出,因此,如果混洗文件已迁移,reducer 可以继续尝试从退役的执行程序提取混洗输出,从而导致
ExecutorDeadException和FetchFailedException错误。解决方案:在运行 Managed Service for Apache Spark 批处理工作负载时,将
spark.reducer.fetchMigratedShuffle.enabled设置为true,以启用混洗位置重新提取(请参阅 设置 Spark 批处理工作负载属性)。 启用此属性后,reducer 任务会在从退役的执行程序提取失败后,从驱动程序重新提取混洗输出位置。