如何在不平衡的执行器工作负载的处理时间内重新平衡RDD



假设我有一个包含1000个元素和10个执行器的RDD。现在,我用10个分区并行化RDD,每个执行器处理100个元素(假设每个执行器有一个任务(。

我的困难在于,这些分区任务中的一些可能比其他任务花费更长的时间,比如说8个执行器将很快完成,而剩下的2个将被困在做某件事的时间更长。因此,主进程将等待2完成后再继续,而8将处于空闲状态。

有什么方法可以让无所事事的执行者从忙碌的执行者那里"拿走"一些工作?不幸的是,我无法提前预测哪些会比其他人"更忙",因此无法提前适当平衡RDD。

我能以某种方式使执行器以编程方式相互通信吗?我想和执行器共享一个DataFrame,但根据我所看到的,我不能在执行器中操作DataFrame?

我使用的是Spark 2.2.1和JAVA

尝试使用spark动态资源分配,它可以根据工作负载上下缩放向应用程序注册的执行器数量。

您可以危害以下属性

spark.dynamicAllocation.enabled = true
spark.shuffle.service.enabled = true

您可以考虑配置以下属性以及

spark.dynamicAllocation.executorIdleTimeout
spark.dynamicAllocation.maxExecutors
spark.dynamicAllocation.minExecutors

Spark提供了一种机制,可以根据工作负载动态调整应用程序占用的资源。这意味着,如果不再使用资源,您的应用程序可能会将资源返还给集群,并在以后有需求时再次请求这些资源。如果Spark集群中有多个应用程序共享资源,则此功能特别有用。

相关内容

最新更新