hadoop yarn是如何控制内存使用量的?

最近在写一个统计程序,因为需要在两个表之间做join操作。于是我的想法就是,把较小的那个表,序列化成一个hadoop的SequenceFile,然后在Map/Reduce的阶段载入。这个SequenceFile其实也不大,就48MB,但是载入内存的时候至少需要1G内存,这让我很奇怪。hadoop默认情况下,每个child jvm只有200MB内存,于是我的这个jar在交给hadoop执行的时候,总是报告out of memory error。

还好,这个默认值可以通过mapred.child.java.opts参数修改。我把它改成了1G。然后用ps命令看,确实在执行org.apache.hadoop.mapred.YarnChild这个类的时候,jvm的参数中有“ -Xmx1G”。但是悲剧的是,这个参数似乎没有被resource manager理解。它以为每个jvm只需要200MB的内存,于是就启动了很多个jvm。然后我的机器就因为物理内存不足,而频繁的在做swap in/swap out。

接着,我把mapreduce.map.memory.mb和mapreduce.reduce.memory.mb这两个参数设置成2048,无任何好转。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥