scala 如何在星火中公平分配工作?

xe55xuns  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(55)

我在6台电脑上运行我的Spark程序(1主+ 5从)与6核心和8GB内存每个.我做了5个分区,我希望一个分区是在1个从并行执行.所以,每个从将有1个任务.但是,当我运行程序,4奴隶什么也没做,1奴隶做了5个任务.我怎么知道这件事?我打印类似“flag”的东西来标识工作节点,然后4个节点什么都不打印,1个节点打印“flag”5次。有人知道这是怎么回事,以及如何让它像我想要的那样工作吗?
以下是我的配置”

spark-submit 
--class MainApp 
--master spark://172.23.8.8:7077 
--deploy-mode client 
--num-executors 5 
--executor-memory 6g  
--executor-cores 6 
--driver-memory 6g 
“C:\MyApps.jar”

字符串

tnkciper

tnkciper1#

尝试将spark.task.cpus设置为单个节点具有的CPU数。
请注意,虽然任务到节点的分配是一种循环调度,但它不是确定性的,取决于任务执行时间、数据局部性、spark.locality.wait参数等。请参阅下面的“数据局部性”页中的引用和TaskSchedulerImpl.resourceOffers()实现。
Spark倾向于将所有任务调度到最佳位置级别,但这并不总是可能的。在任何空闲执行器上都没有未处理的数据的情况下,Spark切换到较低的位置级别。有两种选择:a)等待忙碌CPU释放空间,以启动同一服务器上的数据任务,或b)立即在更远的地方启动一个新任务,需要将数据移动到那里。
Spark通常会等待一段时间,希望忙碌的CPU能够释放。一旦超时,它就开始将数据从远处移动到空闲的CPU。每个级别之间回退的等待超时可以单独配置,也可以在一个参数中一起配置;有关详细信息,请参阅配置页上的spark.locality参数。
一般原则是使用群集中CPU总数的2倍或3倍的分区数,以更好地利用资源。
或者,您可以将(row,preferred_host)元组传递给SparkContext.makeRDD()函数,并使用狭义转换mapPartitions()或foreachPartition()函数来处理每个分区。请参阅在Apache Spark中,是否有方法强制在特定节点上执行DataFrame?
此外,请参阅以下资源以了解更多信息。

相关问题