Hive调整MapReduce内存参数后CPU与内存资源占用差异巨大问题咨询
问题原因分析
1. 1GB配置下的报错与资源使用逻辑
你最初将mapreduce.map.memory.mb和mapreduce.reduce.memory.mb设为1GB时,YARN给单个Map/Reduce容器分配的物理内存上限为1GB,部分计算量较大的任务实际内存占用超过阈值,就会触发YARN的容器kill机制,也就是你看到的Container is running beyond physical memory limits报错。
此时CPU利用率高是因为小内存配置下,单节点可同时启动的容器数量更多,大量并行容器争抢CPU资源,所以整体CPU占用能跑到95%以上。内存仅用50%是因为每个容器的内存上限卡得太死,无法充分利用节点内存,同时还会频繁触发OOM kill。
另外你遇到的虚拟内存超限问题,是因为YARN默认虚拟内存倍率yarn.nodemanager.vmem-pmem-ratio为2.1,1GB物理内存对应的虚拟内存上限就是2.1GB,你的任务用到了2.8GB自然也会触发kill逻辑。
2. 2GB配置下CPU利用率低的原因
将两个参数上调到2GB后,单个容器的内存配额翻倍,在NodeManager总可用内存配额固定的前提下,单节点可同时启动的容器数量直接减半甚至更少,并行执行的任务数大幅下降,没有足够的任务占用CPU资源,所以CPU利用率只剩1%-5%,任务整体执行速度也会变慢。
优化调整方案
- 先确认集群单节点的YARN资源配额:
yarn.nodemanager.resource.memory-mb(节点总可用内存)和yarn.nodemanager.resource.cpu-vcores(节点总可用虚拟核数),通常内存和虚拟核的配比控制在2GB~4GB per vCore为合理区间。 - 不要直接将容器内存从1GB翻倍到2GB,建议先调到1.3GB1.5GB,刚好覆盖任务内存峰值、留20%50%冗余即可。通常Reduce任务内存需求高于Map任务,两个参数不需要保持一致,示例配置如下:
<property> <name>mapreduce.map.memory.mb</name> <value>1536</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> </property> - 如果仍有虚拟内存超限报错,可以适当上调虚拟内存倍率,避免不必要的容器kill:
<property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>3.0</value> </property> - 可通过
mapreduce.job.running.map.limit和mapreduce.job.running.reduce.limit控制单个任务的并行容器数,避免单任务占满所有资源,同时保证节点CPU、内存利用率维持在70%~80%的合理区间,既不会资源闲置也不会出现资源争抢导致的性能下降。
内容的提问来源于stack exchange,提问作者user2894829
相关产品推荐
相关产品推荐

