参数:mapreduce.reduce.shuffle.input.buffer.percent
默认值:0.70
含义:The percentage of memory to be allocated from the maximum heap size to storing map outputs during the shuffle.
参数:mapreduce.reduce.shuffle.parallelcopies
默认值:5
含义:The default number of parallel transfers run by reduce during the copy(shuffle) phase.
上面两个参数表示了hadoop从map向reduce传输数据shuffle的时候所用的内存buffer限制,第一个参数
表示每个shuffle进程占用的memery比例。第二个参数表示最多有几个进程,两个参数的乘积不能最好
不要大于1,不然当同时有5个shuffle时,会占用太多内存,导致报异常。注意这里说的内存值得是java
指定的-Xmx的最大堆内存。
如果修改完上面两个参数还是报错的话,需要进行如下修改:
Hadoop伪分布式模式运行时,运行一个Job报上面错误,原因是由于Hadoop的最大对内存过小,
hadoop默认分配的最大堆内存大小为1000MB,有时候跑的job所需的内存可能比这个数值要大
很多,这是修改运行是的最大大小并不是mapreduce.map.java.opts或者mapreduce.reduce.java.opts
参数的值,他们是在分布式环境下的配置参数。
此时我们需要修改的代码位于hadoop-env.sh文件中(该文件位于HADOOP_HOME_DIR/etc/hadoop
目录下),在该文件中搜索“HADOOP_HEAPSIZE”参数,直接将该行的注释去掉,末尾增加你
需要设置的内存大小,单位默认为MB,比如你想设置最大对内存为4GB,你需要填写4096,
修改完成该行的内容为:
export HADOOP_HEAPSIZE=4096
修改完之后,重启hadoop服务,所有的-Xmx=1000都变为了-Xmx=4096:
4271 ? Sl 0:14 /usr/local/jdk/bin/java -Dproc_namenode -Xmx4096m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/usr/local/hadoop/logs -
4431 ? Sl 0:11 /usr/local/jdk/bin/java -Dproc_datanode -Xmx4096m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/usr/local/hadoop/logs -
4660 ? Sl 0:12 /usr/local/jdk/bin/java -Dproc_secondarynamenode -Xmx4096m -Djava.net.preferIPv4St
这是再启动job,所使用的-Xmx参数也变为了:4096m
/usr/local/jdk/bin/java -Xmx4096m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir