假设我有一个包含1,000个元素和10个执行程序的RDD。现在,我将RDD与10个分区并行化,并由每个执行者处理100个元素(假设每个执行者执行1个任务)。
我的难题是,这些分区任务中的某些任务可能比其他任务花费更长的时间,因此说8个执行者将很快完成,而其余2个执行者将被困更长的时间。因此,主进程将等待2完成,然后再继续,而8将处于空闲状态。
如何使闲置的执行者从忙碌的执行者那里“拿走”一些工作?不幸的是,我无法提前预料到哪个会比其他人“忙”得多,因此无法提前平衡RDD。
我可以以某种方式使执行者以编程方式相互交流吗?我本来想与执行者共享一个DataFrame,但是基于我看到的内容,我无法在执行者内部操纵一个DataFrame?
我正在使用Spark 2.2.1和JAVA
答案 0 :(得分:0)
尝试使用Spark动态资源分配,它会根据工作负载来上下扩展在应用程序中注册的执行程序的数量。
您可以忍受以下属性
Z_{N modulo M}
您也可以考虑配置以下属性
[1, L]
Spark提供了一种机制,可以根据工作负载动态调整应用程序占用的资源。这意味着,如果不再使用资源,您的应用程序可以将资源返还给群集,并在以后有需求时再次请求它们。如果多个应用程序共享您的Spark集群中的资源,则此功能特别有用。