通过期货线程限制触发并发任务?

时间:2018-07-11 13:02:09

标签: multithreading scala apache-spark future

我尝试从不同的线程启动spark任务,以便它们可以同时执行。 根据文档,所有需要做的就是从另一个线程开始任务。

问题是我在齐柏林飞艇中使用了某种方法来完成一些工作,完成了一些阶段,而很少有人有时只由一个工人来处理。由于我必须对不同的数据执行多次相同的操作,因此我认为如果将来的任务有更多的工作,我会得到更好的利用,而不是等待一个任务完全完成再发出下一个任务。

我做了什么?

val sem = new Semaphore(8)
(1 to x).map... {
   sem.aquire
   Future { doWork(data(x)) }.onComplete(println(_)
}

这确实执行并最终完成了工作,但spark UI从未显示超过两个活动的Tasks。

我尝试了不同的配置。 通常每个执行者有7个核心,而2-6个执行者。输入数据的分区数量减少了,因此每个任务执行者很少。我想要备用的。 我尝试过的一切似乎都没有改变,SparkUI中只有两个活动任务可见。

设置是AWS EMR,spark 2.3.0(默认的FAIR调度)和Zeppelin,用于执行代码。 我通过Zeppelin解释器中的SparkSession通过Scala Futures启动了所有代码。

是否有任何scala设置将期货执行的线程数限制为两个? 是否有任何Spark设置将并发执行限制为2个活动任务,还是Spark UI的限制?

0 个答案:

没有答案