我正在从事一项工作,其中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
答案 0 :(得分:1)
如果你的Reduce步骤只有3GB,那就给它们4GB ......!
set mapreduce.reduce.memory.mb = 4096 ;
除非您使用的TEZ具有其通用hive.tez.container.size
的特定属性
答案 1 :(得分:0)
好的,我喜欢更多的解释,但与此同时,这是一个试错的答案: