第一次Hive报错:
java.lang.OutOfMemoryError: Java heap space
解决办法:通过在yarn-site.xml添加以下配置:
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
重启集群,再次执行hive语句,报如下错误:
2.1 GB of 2.1 GB virtual memory used. Killing container
解决办法:
1.通过在yarn-site.xml添加以下配置:
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx2056m</value>
</property>
2.通过在yarn-site.xml添加以下配置:
<property>
<name>mapreduce.cluster.map.memory.mb</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.cluster.reduce.memory.mb</name>
<value>-1</value>
</property>
再次分发配置,重启集群,Hive执行成功。
但有时会成功,有时又会报错:
异常分析:
在此前容器的最小内存和最大内存分别为:2048m和2048m,而map和reduce都没有配置,此时默认值均为2048m,也就是log中的“2.1 GB physical
memory used”。而由于使用了默认虚拟内存率(也就是2.1倍),所以对于Map Task和Reduce Task总的虚拟内存为都为2048*2.1=4G。而应用的虚拟内存超过了这个数值,故报错 。解决办
法:在启动Yarn是调节虚拟内存率或者应用运行时调节内存大小。
此时,再把容器的最大内存和最小内存调大分别是10000和3000,并单独把map和reduce的内存调到4000,这时运行成功,内存相关配置代码如下:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>10000</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>3000</value>
</property>
<property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4000</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4000</value>
</property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx3080m</value>
</property>
<property>
<name>mapreduce.cluster.map.memory.mb</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.cluster.reduce.memory.mb</name>
<value>-1</value>
</property>