“容器超出了物理内存限制”

时间:2017-10-18 10:24:25

标签: hadoop hive reduce reducers

我正在从事一项工作,其中Hive查询使用R文件,分布在群集上以在每个节点上运行。

就像那样:

ADD FILES hdfs://path/reducers/my_script.R
SET hive.mapred.reduce.tasks.speculative.execution=false;
SET mapred.reduce.tasks = 80;

INSERT OVERWRITE TABLE final_output_table
PARTITION (partition_column1, partition_column2)
SELECT  selected_column1, selected_column2, partition_column1, partition_column2
FROM (
    FROM
      (SELECT input_column1, input_column2, input_column3
       FROM input_table
       WHERE partition_column1 = ${parameter1}
         AND partition_column1 = ${parameter2}
       distribute BY concat(input_column1, partition_column1)) mapped
    REDUCE input_column1, input_column2, input_column3
    USING 'my_script.R'
    AS selected_column1, selected_column2
) reduced

(希望我的简化代码没有错误,我相信我的实际代码中没有错误)

许多减少工作中的一些成功(我上次尝试17次,前一次尝试58次),有些人被杀(最后一次尝试64次,前一次尝试23次),有些失败(最后一次尝试失败31次) ,前一个25)。

如果需要,你会在问题的底部找到一个失败的减少尝试的完整日志,但如果我没有弄错,这里有重要的部分:

Container [pid=14521, containerID=container_1508303276896_0052_01_000045] is running beyond physical memory limits. 
Current usage: 3.1 GB of 3 GB physical memory used; 6.5 GB of 12 GB virtual memory used. 
Killing container. 
[...]
Container killed on request. 
Exit code is 143 Container exited with a non-zero exit code 143

我的理解:在my_script.R完成数学运算期间发生的事情会占用太多物理内存。

我们假设my_script.R中的代码无法改进,而distribute的发生方式也不可能是其他任何内容。

我的问题是:我能做些什么来避免记忆太多?

  • 设置更多(或更少?)减速器?

或者,也许(因为一些减速器成功):

  • 增加工作的次数? (如果是这样:怎么样?)
  • 超时前增加时间? (如果是这样:怎么样?)

如果它有用:

Average Map Time        1mins, 3sec
Average Shuffle Time    10sec
Average Merge Time      1sec
Average Reduce Time     7mins, 5sec

其中一次失败的减少尝试的完整日志(来自Hadoop作业监控控制台,端口8088和19888):

Container [pid=14521,containerID=container_1508303276896_0052_01_000045] is running beyond physical memory limits. 
Current usage: 3.1 GB of 3 GB physical memory used; 6.5 GB of 12 GB virtual memory used. 
Killing container. 
Dump of the process-tree for container_1508303276896_0052_01_000045 : 
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE 
|- 15690 14650 14521 14521 (R) 5978 434 2956750848 559354 /usr/lib/R/bin/exec/R --slave --no-restore --file=/mnt/bi/hadoop_tmp/nm-local-dir/usercache/hadoop/appcache/application_1508303276896_0052/container_1508303276896_0052_01_000045/./my_script.R 
|- 14650 14521 14521 14521 (java) 3837 127 3963912192 262109 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx2048m -Djava.io.tmpdir=/mnt/bi/hadoop_tmp/nm-local-dir/usercache/hadoop/appcache/application_1508303276896_0052/container_1508303276896_0052_01_000045/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/mnt/bi/hadoop_tmp/userlogs/application_1508303276896_0052/container_1508303276896_0052_01_000045 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.32.128.5 20021 attempt_1508303276896_0052_r_000014_0 45 
|- 14521 20253 14521 14521 (bash) 1 2 13578240 677 /bin/bash -c /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx2048m -Djava.io.tmpdir=/mnt/bi/hadoop_tmp/nm-local-dir/usercache/hadoop/appcache/application_1508303276896_0052/container_1508303276896_0052_01_000045/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/mnt/bi/hadoop_tmp/userlogs/application_1508303276896_0052/container_1508303276896_0052_01_000045 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.32.128.5 20021 attempt_1508303276896_0052_r_000014_0 45 
1>/mnt/bi/hadoop_tmp/userlogs/application_1508303276896_0052/container_1508303276896_0052_01_000045/stdout 
2>/mnt/bi/hadoop_tmp/userlogs/application_1508303276896_0052/container_1508303276896_0052_01_000045/stderr 
Container killed on request. 
Exit code is 143 Container exited with a non-zero exit code 143

2 个答案:

答案 0 :(得分:1)

如果你的Reduce步骤只有3GB,那就给它们4GB ......! set mapreduce.reduce.memory.mb = 4096 ;

除非您使用的TEZ具有其通用hive.tez.container.size的特定属性

<小时/> 有关YARN如何管理内存配额的其他信息,请参阅Distcp - Container is running beyond physical memory limits

答案 1 :(得分:0)

好的,我喜欢更多的解释,但与此同时,这是一个试错的答案:

  • 尝试了40个减速器,失败了。
  • 尝试了160个减速器,成功了一次。再建几次以确定它是否可靠,如果只是一次成功,我会更新我的答案。