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

时间:2018-08-03 15:59:01

标签: apache-spark apache-spark-sql

假设我有一个包含1,000个元素和10个执行程序的RDD。现在,我将RDD与10个分区并行化,并由每个执行者处理100个元素(假设每个执行者执行1个任务)。

我的难题是,这些分区任务中的某些任务可能比其他任务花费更长的时间,因此说8个执行者将很快完成,而其余2个执行者将被困更长的时间。因此,主进程将等待2完成,然后再继续,而8将处于空闲状态。

如何使闲置的执行者从忙碌的执行者那里“拿走”一些工作?不幸的是,我无法提前预料到哪个会比其他人“忙”得多,因此无法提前平衡RDD。

我可以以某种方式使执行者以编程方式相互交流吗?我本来想与执行者共享一个DataFrame,但是基于我看到的内容,我无法在执行者内部操纵一个DataFrame?

我正在使用Spark 2.2.1和JAVA

1 个答案:

答案 0 :(得分:0)

尝试使用Spark动态资源分配,它会根据工作负载来上下扩展在应用程序中注册的执行程序的数量。

您可以忍受以下属性

Z_{N modulo M}

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

[1, L]

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