我正在使用hadoop群集运行火花程序,该群集使用纱线调度程序来运行任务。但是,我注意到一种奇怪的行为。纱线有时会杀死一项任务,因为内存错误,纱线指责,而如果我在弹奏中执行任务,即执行与容器/执行者相同数量的任务,让他们完成,然后执行下一组任务,则运行良好,这意味着任务没有比容器中允许的更多内存。因此,我怀疑Yarn试图在容器中并行运行多个任务,这就是为什么容器脱离存储器的原因。有没有办法限制此行为并告诉Yarn一次在容器中一次运行一个任务。
通常,火花请求的每个纱线容器总体上直接对应于一个"执行程序",即使纱线可能会报告每个容器分配的1个CPU,在Hood Spark下,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
内部)。
请注意,每个机器仍然可能有多个纱线容器;如果您想一次每次机器一次限制1个任务,您还需要扩展spark.executor.memory
,成为每台机器上可用的内存量(分配给该机器上运行的Yarn NodeManager拒绝打包任何大于您告诉NodeManager的容器,即使物理内存更大,也可以使用它。或者,您可能会发现简单需要将计算机雕刻到稍大的块,因此您可以使用该内存设置来找到正确的内存大小而不会牺牲太多并行性。