配置问题
1.只能本地运行
具体问题
通过hadoop jar的方式提交jar包,但是只能本地运行Local_job。
解决方法
hadoop部署包下/etc/hadoop/yarn.xml配置出错。缺少如下配置,添加即可。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
2.内存溢出
具体问题
内存超出限制,container被kill,导致任务失败。异常如下所示,在博客《Container is running beyond virtual memory limits…》中对这个问题有清楚的讲解。
Container [pid=100156,containerID=container_1513249052998_0001_02_000001] is running beyond virtual memory limits.
Current usage: 114.4 MB of 1 GB physical memory used;
2.2 GB of 2.1 GB virtual memory used. Killing container.
上述信息中,分配了1GB的物理内存,占用了114.4MB,未超出限制。1GB是默认分配的物理内存大小。这个值应该是由mapreduce.map.memory.mb和mapreduce.reduce.memory.mb决定。这个值设置的是 Container 的内存上限,这个参数由 NodeManager 读取并进行控制,当 Container 的内存大小超过了这个参数值,NodeManager 会负责 kill 掉 Container。
分配了2.1GB的虚拟内存,占用了2.2GB超出了限制。2.1GB是默认分配的虚拟内存大小。这个值实际上由默认物理内存大小和yarn.nodemanager.vmem-pmem-ratio决定。yarn.nodemanager.vmem-pmem-ratio表示虚拟内存和物理内存的比例,默认为2.1。
解决方法
方法1:解除虚拟内存的检查。在yarn-site.xml文件中添加设置如下,但是这个方法比较危险,可能导致集群崩坏。
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers.</description>
</property>
方法2:在mapred-site.xml文件中添加设置,增大默认的物理内存大小(mapreduce.map.memory.mb和mapreduce.reduce.memory.mb),注意,这个值不能超过yarn.scheduler.maximum-allocation-mb(可以通过yarn-site.xml设置)的大小;在yarn-site.xml文件中添加设置,增大虚拟内存/物理内存比例(yarn.nodemanager.vmem-pmem-ratio)。
最终,我在mapred-site.xml文件中增大了物理内存,另外还增加了mapreduce.map.java.opts和mapreduce.reduce.java.opts的设置。在《mapreduce on yarn简单内存分配解释》中有比较清除的解释,如下:
以map任务为例,Container其实就是在执行一个脚本文件,而脚本文