spark+yarn调整计算任务的内存占用

调整的背景


公司正式环境有一个小小的spark+hadoop集群,yarn的可用内存只有小小的40G,五个节点,每个节点8G内存,因此需要对每个上线的计算任务占用的资源都要精打细算。
写了两个sparkstreaming的任务,发现其中一个任务用了三个container,每个container占用了2G的内存,另外一个任务用了四个container,每个container占用了2G的内存,这样算下来,两个任务一共占用了14G 的内存,由于任务分配有时候不太均匀,导致有时候一个节点上就跑了个container,使得其他离线任务在占用资源较多的时候,会出现资源竞争激烈,长时间排队等待无法执行的情况。
而实际上,streaming的任务并不需要占用如此多的资源,应该就可以完成任务,于是开始寻找调小任务占用资源的方法

修改spark任务提交时的参数


第一步:尝试调整提交spark任务时设定的--executor-memory参数,由原来的2G,调整为500m,
修改以后,发现任务可以正常的运行,可是每个container占用的内存仍然是2G,没有得到任何的改善。
经过查看各种文档,各种百度,发现,当executor-memory小于yarn中设置的yarn.scheduler.minimum-allocation-mb时,yarn讲分配给container yarn.scheduler.minimum-allocation-mb中设置的内存,所以会出现无论我怎么设置 executor-memory,最后分配的内存都是2G,因为我的yarn.scheduler.minimum-allocation-mb设置的是2048


修改yarn.scheduler.minimum-allocation-mb


于是我修改了hadoop/etc/hadoop/yarn-site.xml中的yarn.scheduler.minimum-allocation-mb为500m,将该配置文件分发到其他的yarn节点中,重启yarn。
重新提交任务,结果提交任务的时候如下错误
spark ERROR YarnClientSchedulerBackend: Yarn application has already exited
于是又是一顿百度,一顿各种文档,发现原因是这样的,
由于我的yarn.scheduler.minimum-allocation-mb设置的比较小,当spark任务启动的时候,会有一瞬间,内存的占用会出现翻倍的情况,这个我在yarn控制台看到过这样的现象,然后就会恢复到正常水平,yarn中有这样的配置
yarn.nodemanager.pmem-check-enabled   是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true
yarn.nodemanager.vmem-check-enabled    是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是tru e
这样就很明确了,原来是任务被yarn杀死了,

修改 yarn.nodemanager.pmem-check-enabled yarn.nodemanager.pmem-check-enabled


将这两个参数设置为false ,并将hadoop/etc/hadoop/yarn-site.xml分发的所有节点中,并重启yarn
再次提交任务,任务正常运行,内存的占用也降下来了,基本是原来的1/2左右的占用量


总结


对于小型的集群来说,资源的精打细算还是十分有必要的,当然,本次的调优并不是spark调优的全部,后续还需要对并行度进行调优,以及如何防止倾斜进行调优,革命尚未成功,同志仍需努力

你可能感兴趣的:(spark)