推理执行是 Spark 中的一项功能,当它认为任务需要更多时间才能完成时,会启动重复任务。 此重复任务在运行原始任务的的节点之外新节点中启动。 这意味着,通过启用推理执行,可以轻松缓解由于工作器节点损坏而导致的问题。 这是 Spark 尽快完成作业的方式。 如果其中一个任务先完成,则其他任务会被终止。
如何监视?
可以从 spark UI 监视此情况,其中任务 ID 将“推理”显示为 true。
影响此推理行为的配置
属性名称 | 违约 | DESCRIPTION |
---|---|---|
spark.speculation |
假 | 如果设置为“true”,则执行任务的推理执行。 这意味着,如果一个或多个任务在某个阶段运行缓慢,它们将重新启动。 |
spark.speculation.interval |
100 毫秒 | Spark 多久检查一次要推理的任务。 |
spark.speculation.multiplier |
1.5 | 此设置确定在 Spark 考虑对某个任务进行推理执行之前,该任务的速度与任务时间中值相比可以慢多少。 它是任务持续时间中值的乘数。 例如,如果某个阶段的任务时间中值为 10 秒,而你设置 spark.speculation.multiplier = 1.5,Spark 会将运行超过 15 秒(1.5 * 10 秒)的任何任务都视为运行缓慢且有资格进行推理执行。 |
spark.speculation.quantile |
0.75 | Spark 开始应用推理执行之前完成的任务百分比。 默认值是阶段中完成 75% 的任务后开始推理。 |
spark.speculation.minTaskRuntime |
100 毫秒 | 此设置定义了在考虑对某任务进行推理执行之前该任务应运行的最短时间。 如果任务运行速度低于此阈值,不会触发推理执行。 例如,如果 spark.speculation.minTaskRuntime = 5 秒,则完成时间少于 5 秒的任务不会被推理执行,即使它们与阶段中的其他任务相比速度更慢也是这样。 |
示例:
在下图中,让我们考虑一个阶段中共有 10 个任务,但任务 5 需要超过 5 秒的时间才能完成。
当 spark.speculation.minTaskRuntime
设置为 5 秒时,它会在新节点上启动新任务 SP-task5
。
作业完成后,驱动程序会终止原始任务 5。
何时不运行推理执行?
- 当数据倾斜时,推理的任务与原始任务花费相同的时间(这会增加资源消耗量),并延长执行时间。 首先必须解决数据倾斜问题。
- 启用推理执行后,如果出现任何意外的执行程序或节点故障,有时会创建重复记录。 确保作业是幂等的。
- 启用推理可能会影响性能,因为正在创建重复任务。 如果性能是一个问题,请确保禁用它。
- 不得在生产作业上长时间使用推理执行。 扩展使用可能会导致任务失败/容量问题。