非java程序(c++、shell程序)在MR内存设置上,和java程序有很大差异,如果按照java程序的方式设置,很容易采坑,具体如下:
- MR中各个内存情况
- 因为在yarn container这种模式下,map/reduce task是运行在Container之中的,所以上面提到的mapreduce.map(reduce).memory.mb大小都大于mapreduce.map(reduce).java.opts值的大小。mapreduce.{map|reduce}.java.opts能够通过Xmx设置JVM最大的heap的使用,一般设置为0.75倍的memory.mb,因为需要为java code等预留些空间
- JVM不考虑分配的任何外部内存。子进程分配的内存不计入Jvm堆的大小,例如shell方式调用c++的MR时,c++程序中分配的内存不计入java.opts中,所以对于这种情况,需要把java.opts设置的小一些,因为子进程内存加上java.opts的内存才是使用的总内存,当他们的和超过container的最大内存时,就会报错。
参考文档
- https://blog.csdn.net/picway/article/details/80718705
- https://www.coder.work/article/2203529
- https://cnpython.com/qa/527024
- https://zhuanlan.zhihu.com/p/90953401
- https://www.cnblogs.com/tesla-turing/p/11958842.html (Mapreduce性能优化)