我正在使用hadoop集群运行Spark程序,该集群使用yarn调度程序来运行任务。但是,我注意到一种奇怪的行为。纱线有时会导致一个抱怨内存错误的任务,而如果我执行轮次中的任务,即执行与容器/执行器相同数量的任务,让它们完成,然后执行下一组任务,它运行正常,意味着任务不使用容器中允许的任何内存。因此,我怀疑纱线试图在容器中并行运行多个任务,这就是容器内存不足的原因。有没有办法限制这种行为,并告诉纱线在容器中一次只能运行一个任务。
答案 0 :(得分:2)
通常,Spark请求的每个YARN容器都直接对应一个" executor"即使YARN可能会报告每个容器分配1个CPU,但引擎盖下Spark使用spark.executor.cores
设置来确定打包到单个执行器/容器进程中的并发任务数。
所以只需设置spark.executor.cores=1
,每个YARN容器一次只能处理一个任务。这可以作为spark-submit
之类的--conf spark.executor.cores=1
配置完成,也可以将其放在conf/spark-defaults.conf
中(大多数标准的hadoop安装都在/etc/spark/conf/spark-defaults.conf
内)。
请注意,每台计算机可能仍有多个YARN容器;如果您希望每个计算机一次进一步限制1个任务,您还需要将spark.executor.memory
扩展为每台计算机上可用的内存量(分配给运行的YARN NodeManagers)在那台机器上; YARN将拒绝打包任何大于您已经告诉NodeManager它允许使用的容器,即使物理内存较大也是如此。或者你可能会发现你只需要将你的机器分割成更大的块,这样你就可以使用那个内存设置来找到合适的内存大小而不会牺牲太多的并行性。