이 경우는 컨테이너 사이즈가 작기 때문이다.
yarn 에서 컨테이너 사이즈보다 메모리를 많이 쓰게되면 리소스 관리를 하다가 강제로 container를 죽여버린다.
그래서 hive.tez.container.size 와 set hive.tez.java.opts 사이즈를 늘려줘야한다.
참고로 hive.tez.java.opts는 컨테이너 크기의 80% 수준으로 지정하는것이 일반적이다.
만약, java.opt 값이 작게 지정된거라면 heap 어쩌구 하는 에러가 날것이다.
--------------------------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
--------------------------------------------------------------------------------
Map 1 .......... SUCCEEDED 1 1 0 0 0 0
...
Map 46 FAILED 1 0 0 1 4 0
....
Status: Failed
Vertex failed, vertexName=Map 46, vertexId=vertex_1466764800233_14303_1_05, diagnostics=[Task failed, taskId=task_1466764800233_14303_1_05_000000, diagnostics=[TaskAttempt 0 failed, info=[Container container_1466764800233_14303_01_000024 finished with diagnostics set to [Container failed, exitCode=-104. Container [pid=19273,containerID=container_1466764800233_14303_01_000024] is running beyond physical memory limits. Current usage: 1.3 GB of 1 GB physical memory used; 3.8 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1466764800233_14303_01_000024 :
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
|- 19354 19273 19273 19273 (java) 1006 76 3990794240 339542 /usr/java/jdk1.7.0_67-cloudera/bin/java -server -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx3g -Dlog4j.configuratorClass=org.apache.tez.common.TezLog4jConfigurator -Dlog4j.configuration=tez-container-log4j.properties -Dyarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1466764800233_14303/container_1466764800233_14303_01_000024 -Dtez.root.logger=INFO,CLA -Djava.io.tmpdir=/data10/yarn/nm/usercache/user/appcache/application_1466764800233_14303/container_1466764800233_14303_01_000024/tmp org.apache.tez.runtime.task.TezChild 호스트명 34263 container_1466764800233_14303_01_000024 application_1466764800233_14303 1
|- 19273 19259 19273 19273 (bash) 0 0 112906240 317 /bin/bash -c /usr/java/jdk1.7.0_67-cloudera/bin/java -server -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx3g -Dlog4j.configuratorClass=org.apache.tez.common.TezLog4jConfigurator -Dlog4j.configuration=tez-container-log4j.properties -Dyarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1466764800233_14303/container_1466764800233_14303_01_000024 -Dtez.root.logger=INFO,CLA -Djava.io.tmpdir=/data10/yarn/nm/usercache/user/appcache/application_1466764800233_14303/container_1466764800233_14303_01_000024/tmp org.apache.tez.runtime.task.TezChild 호스트명 34263 container_1466764800233_14303_01_000024 application_1466764800233_14303 1 1>/var/log/hadoop-yarn/container/application_1466764800233_14303/container_1466764800233_14303_01_000024/stdout 2>/var/log/hadoop-yarn/container/application_1466764800233_14303/container_1466764800233_14303_01_000024/stderr
만약, 이렇게 설정되어있었다면, 좀더 사이즈를 늘려본다.
set hive.execution.engine=tez;
set hive.tez.container.size=1024;
set hive.tez.java.opts=-Xmx816m;
예를 들면, 이런식으로
컨테이너 사이즈를 크게 잡으면 mapper/reducer 갯수가 상대적으로 줄어들기 때문에
메모리를 무조건 크게 잡는게 빠른건 아니다. 무조건 크게하기보다는 상황에 맞게 fit 하게 맞추는게 유용하다.
set hive.execution.engine=tez;
set hive.tez.container.size=2048;
set hive.tez.java.opts=-Xmx1632m;