2017-10-18 154 views
1

我正在開發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

「讓我們假設沒有改善可以做my_script.R中的代碼「我發現這是一個極不可能的假設。無論如何,如果你做出這個假設,你就不應該用[tag:r]來標記這個問題。 – Roland

回答

0

好吧,我喜歡更多的解釋,但在此期間,這裏有一個試錯的答案:

  • 嘗試了40個減速器,失敗了。
  • 試過160個減速器,成功一次。再多建幾次,看看它是否可靠,如果只是一次性成功,我會更新我的答案。
1

如果你的Reduce步驟只有3GB的邊界,就給他們4GB ...!
set mapreduce.reduce.memory.mb = 4096 ;

除非你使用TEZ這對於其通用hive.tez.container.size


特定屬性有關YARN如何管理內存配額的額外信息,請參閱 Distcp - Container is running beyond physical memory limits