Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 限制纱线容器一次仅执行一个任务_Scala_Hadoop_Apache Spark_Yarn_Bigdata - Fatal编程技术网

Scala 限制纱线容器一次仅执行一个任务

Scala 限制纱线容器一次仅执行一个任务,scala,hadoop,apache-spark,yarn,bigdata,Scala,Hadoop,Apache Spark,Yarn,Bigdata,我正在运行一个使用hadoop集群的Spark程序,它使用纱线调度器来运行任务。然而,我注意到一种奇怪的行为。纱线有时会杀死一个抱怨内存不足错误的任务,而如果我轮次执行任务,也就是说,执行与容器/执行器数量相同的任务,让它们完成,然后执行下一组任务,它运行良好,这意味着任务使用的内存不会超过容器中允许的内存。所以,我怀疑Thread试图在一个容器中并行运行多个任务,这就是容器内存不足的原因。有没有一种方法可以限制这种行为,并告诉Thread在一个容器中一次只运行一个任务。通常,触发请求的每个Th

我正在运行一个使用hadoop集群的Spark程序,它使用纱线调度器来运行任务。然而,我注意到一种奇怪的行为。纱线有时会杀死一个抱怨内存不足错误的任务,而如果我轮次执行任务,也就是说,执行与容器/执行器数量相同的任务,让它们完成,然后执行下一组任务,它运行良好,这意味着任务使用的内存不会超过容器中允许的内存。所以,我怀疑Thread试图在一个容器中并行运行多个任务,这就是容器内存不足的原因。有没有一种方法可以限制这种行为,并告诉Thread在一个容器中一次只运行一个任务。

通常,触发请求的每个Thread容器直接对应一个“执行器”,即使Thread可能报告每个容器分配了一个CPU,引擎盖下Spark使用
Spark.executor.cores
设置来确定打包到单个执行器/容器进程中的并发任务数

因此,只需设置
spark.executor.cores=1
,每个纱线容器一次只能处理一个任务。这可以通过
spark submit
配置完成,比如
--conf spark.executor.cores=1
,也可以将其放入
conf/spark defaults.conf
(在大多数标准hadoop安装中,这将在
/etc/spark/conf/spark defaults.conf
中)


请注意,每台机器可能仍有多个纱线容器;如果您想进一步限制每台机器一次只能执行一个任务,您还需要将
spark.executor.memory
扩展为每台机器上可用的内存量(分配给在该机器上运行的Thread NodeManager;Thread将拒绝包装任何大于您告诉NodeManager允许使用的容器,即使物理内存更大)。或者您可能会发现,您只需要将计算机分割成稍大的块,这样您就可以在不牺牲太多并行性的情况下使用该内存设置来找到合适的内存大小。

您可以添加有关您所采用的两种方法的更多详细信息,例如,有多少执行器和执行器内存。您运行的不同之处是什么t任务组(是否基于内存?)在第一种方法中,我只使用map。在第二种方法中,我多次运行程序,每次的任务数等于执行者的数量。当我这样做时,它工作正常,但当我简单地使用map并一次性运行它时,它失败了。嗨@Dennis Hoo,为什么不呢将executors设置为1。核心正好位于处理并行性的executor的顶部。你是说设置
spark.executor.instances=1
?在问题中,它说纱线正在杀死超过内存限制的容器,这表明问题在于每个容器内spark执行环境的形成,而不是r而不是Spark应用程序如何打包到Thread本身中。例如,如果Spark.executor.cores当前在配置中默认为16,则请求
Spark.executor.instances=1
只会将应用程序限制在单个Thread容器中运行,但它仍会尝试在任何内存中并行执行16件事情在这种情况下,pythonic可能仍然希望利用任何可用的并行性,只需要确保每个容器的形状能够正确容纳任务。因此,假设每台机器有16个内核和16 GB ram,但每个任务需要将4GB加载到内存中。如果spark.executor.instances=1,spark.executor.cores=16,spark.executor.memory=16G,则spark将获取1个容器,并尝试一次运行16个任务。然后它将被Thread踢出,因为这16个任务将尝试在该容器中总共使用16*4GB==64GB。或者,假设我们设置spark.executor.instances=1,spark.executor.cores=1,spark.executor.memory=16G。然后spark将获取1容器并尝试一次运行1个任务,这样运行正常,但只使用16GB中的4个。在这种情况下,更理想的做法是只设置spark.executor.instances=999,spark.executor.cores=1,spark.executor.memory=4GB。在16GB机器上,Thread会要求4个执行器,每个执行器一次只执行1个任务,每个执行器可以使用全部4GB。此外,如果集群实际上有10台可用机器,那么spark.executor.instances=999允许您使用所有10台机器,每台机器打包4个执行器,总共40个执行器,每个执行器可以使用4GB。