内存配置
- 常见的内存配置如下 | 配置 | 说明 | | —- | —- | | mapreduce.map.memory.mb | 设置map task内存大小 | | mapreduce.reduce.memory.mb | 设置reduce task内存大小 | | yarn.scheduler.minimum-allocation-mb | 允许Container申请的最小内存 | | yarn.scheduler.maximum-allocation-mb | 允许Container申请的最大内存 | | yarn.scheduler.increment-allocation-mb | 内存增量 | | yarn.nodemanager.resource.memory-mb | NodeManager可以分配给NodeManager的物理内存 |
参数关系
mapreduce.map.memory.mb和mapreduce.reduce.memory.vcores是客户端的配置,就是提交MR Job时候需要设定的,这个Job的具体是什么样需求,然后提交给YARN,申请资源。不同的MR Job可以配置不同的参数
yarn.scheduler.minimum-allocation-mb和yarn.scheduler.maximum-allocation-mb是服务器端的配置,客户端请求的内存也就是mapreduce.map.memory.mb 必须落在服务端的上下限范围内。否则请求不能被满足yarn.scheduler.minimum-allocation-mb < mapreduce.map.memory.mb < yarn.scheduler.maximum-allocation-mb
举个例子吧,如果现在参数配置如下
yarn.scheduler.minimum-allocation-mb = 2Gyarn.scheduler.maximum-allocation-mb = 10Gyarn.scheduler.increment-allocation-mb = 500M
那么客户端请求mapreduce.map.memory.mb应该会有四种情况
mapreduce.map.memory.mb<1G, 那container内存还是2Gmapreduce.map.memory.mb=2G~10G, 那就取mapreduce.map.memory.mb大小mapreduce.map.memory.mb=2.1G, 那还是取2.5G,因为yarn.scheduler.increment-allocation-mb 是0.5Gmapreduce.map.memory.mb>10G ,会报错
容器详解
运行container就是运行了一个java程序,参数mapreduce.map.memory.mb就是设置java程序所拥有的资源
那么根据mapreduce.map.memory.mb参数申请到的资源会被划分成如下几个部分

- 在yarn中还有个参数可以设置container的堆大小mapreduce.map.java.opts = “-Xmx512m” / mapreduce.reduce.java.opts = “-Xmx512m”,下面有个较为直观的图显示各个参数会影响哪些东西
常见问题
- container物理内存或虚拟内存超限:配置的mapreduce.map.java.opts参数必须要小于mapreduce.map.memory.mb,因为还要预留一些空间给方法区、栈来运行我们的代码,一般预留20%左右即可,出现这种问题有可能是你配置的mapreduce.map.java.opts参数过大,导致无法运行代码,一般来说增加mapreduce.map.memory.mb或者减少mapreduce.map.java.opts

- OOM:在日志中还有可能出现OOM的情况,这种问题有可能是mapreduce.map.memory.mb参数设置过小,同时导致mapreduce.map.java.opts过小,如果此时读取的数据特别多,就有可能造成OOM,建议同时增加mapreduce.map.memory.mb和mapreduce.map.java.opts


