解决Spark莫名卡住问题
有时候Spark任务莫名会在某个Stage卡住,然后一直停在那里,如果任务重新跑的话又是没有问题的,在实际项目中如果这样的任务出现了,需要仔细分析Spark的log,这样的情况一般是数据不均衡导致的某个节点任务量偏大,而这个节点分配不到太多内存(其他还有很多任务都在这里运行)导致任务卡顿。有几个参数非常有效,主要是Spark的任务推测执行参数,任务推测执行默认是不开启的,因为开启了是会浪费资源的,如果经常有任务卡顿,需要添加这个参数
参数名 | 默认值 | 含义 |
---|---|---|
spark.speculation | False | 以下几个参数是关于Spark推测执行机制的相关参数。此参数设定是否使用推测执行机制,如果设置为true则spark使用推测执行机制,对于Stage中拖后腿的Task在其他节点中重新启动,并将最先完成的Task的计算结果最为最终结果 |
spark.speculation.interval | 100 | Spark多长时间进行检查task运行状态用以推测,以毫秒为单位 |
spark.speculation.quantile | 推测启动前,Stage必须要完成总Task的百分比 | |
spark.speculation.multiplier | 1.5 | 比已完成Task的运行速度中位数慢多少倍才启用推测 |
在实际应用在,可以根据实际情况设置参数值,例如可以设置500ms检查一下状态,Stage完成0.9我们才开启推测任务,比已完成Task的运行速度中位数慢1.2倍才开启。总之,这是个非常不错的参数。