使用4台Linux虚拟机搭建Hadoop HA集群后运行自行编写的轨迹数据处理程序时出现以下错误(原始文件1.3GB),该程序在本机Java环境下可正常运行。控制台提示错误如下,显然每个Task需要使用的虚拟内存值超过了yarn默认Container的最大内存值,导致container被Kill,程序运行中断。
解决方案:
思路一:在Container容量不变的情况下,降低每个Task的数据量,使之不再溢出
Task的数据量必须大于HDFS中数据块的大小,Hadoop 3.x.x版本默认每个Block块的大小为128MB,若需要降低Block的大小,需在hdfs-site.xml配置文件中添加以下内容,其中xxx是每个块的字节数,例如128MB对应的数值为1024*1024*128=134217728,修改至合适的数值后重启HA集群。
<property> <name>dfs.blocksize</name> <value>xxx</value> </property>思路二:扩大Container虚拟内存的容量,使之不再溢出
具体设置原理可参阅https://blog.csdn.net/u010226454/article/details/80907088;
笔者使用的Hadoop 3.1.4按照上文配置并启动集群后产生“无法加载主类480”错误,在查阅Hadoop网站中提供的默认yarn-site.xml和mapred-site.xml文件后,发现上文部分配置的位置需要修正。下方的设定参数将container的可用物理内存设定为2GB,可用虚拟内存容量默认为物理内存的2.1倍,虚拟内存可用量为4.2GB。
yarn-site.xml
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>2048</value> </property>mapred-site.xml
<property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>2048</value> </property> <property> <name>yarn.app.mapreduce.am.command-opts</name> <value>-Xmx1638m</value> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> </property>若程序的物理内存占用量较小,但是虚拟内存占用量较大,可设定参数改变虚拟内存和物理内存的比例,实现内存调优。下方的设定将虚拟内存调整为物理内存的5倍。
yarn-site.xml
<property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>5</value> </property>