无论是使用动态分配还是显式指定执行程序(16)和执行程序核心(8),即使未完成的任务远远超出当前执行程序数,我也一直在丢失执行程序。
例如,我有一份工作(Spark SQL),运行超过27,000个任务,其中14,000个完成,但执行者"腐烂"从128下降到16,还有数千项任务尚未完成。日志没有注意到导致这些丢失执行者的任何错误/异常。
这是一个在AWS EC2实例上运行的Cloudera CDH 5.10集群,具有136个CPU内核和Spark 2.1.0(来自Cloudera)。
17/05/23 18:54:17 INFO yarn.YarnAllocator: Driver requested a total number of 91 executor(s).
17/05/23 18:54:17 INFO yarn.YarnAllocator: Canceling requests for 1 executor container(s) to have a new desired total 91 executors.
这是一个缓慢的衰变,每分钟左右的执行者被删除。
一些可能相关的配置选项:
spark.dynamicAllocation.maxExecutors = 136
spark.dynamicAllocation.minExecutors = 1
spark.dynamicAllocation.initialExecutors = 1
yarn.nodemanager.resource.cpu-vcores = 8
yarn.scheduler.minimum-allocation-vcores = 1
yarn.scheduler.increment-allocation-vcores = 1
yarn.scheduler.maximum-allocation-vcores = 8
为什么遗嘱执行人员会腐朽,我该如何防止它呢?