TEZ를 이용하여 작업을 처리할 때 발생하는 이 오류는 YARN에 지정한 컨테이너에 할당할 수 있는 최대 메모리보다, TEZ 컨테이너 사이즈 설정이 더 클때 발생합니다. YARN에 설정된 최대 메모리 이하로 컨테이너 사이즈를 설정해야 합니다. MR 엔진을 이용할 때도 최대 메모리 이하로 설정해야 합니다.
# YARN에서 관리하는 컨테이너의 최대 메모리 설정
set yarn.scheduler.maximum-allocation-mb=11520;
# TEZ의 컨테이너당 메모리 설정
set hive.tez.container.size=1440;
# MR의 매퍼 메모리 설정
set mapreduce.map.memory.mb=2048;
# MR의 리듀서 메모리 설정
set mapreduce.reduce.memory.mb=2048;
# 다음의 경우 오류 발생
yarn.scheduler.maximum-allocation-mb < hive.tez.container.size
# 오류 내용(최대 설정가능한 메모리와 코어개수가 표시됨)
Status: Failed
Vertex's TaskResource is beyond the cluster container capability,Vertex=vertex_1532389969952_635131_1_00 [Map 5], Requested TaskResource=<memory:12960, vCores:1>, Cluster MaxContainerCapability=<memory:11520, vCores:128>
TEZ의 DAGImpl 코드를 보면 로컬 모드가 아닐 때 태스크의 리소스와 클러스터의 정보를 비교해서 오류를 출력하도록 구현되어 있는 것을 알 수 있다.
// check task resources, only check it in non-local mode
if (!appContext.isLocal()) {
for (Vertex v : vertexMap.values()) {
if (v.getTaskResource().compareTo(appContext.getClusterInfo().getMaxContainerCapability()) > 0) {
String msg = "Vertex's TaskResource is beyond the cluster container capability," +
"Vertex=" + v.getLogIdentifier() +", Requested TaskResource=" + v.getTaskResource()
+ ", Cluster MaxContainerCapability=" + appContext.getClusterInfo().getMaxContainerCapability();
LOG.error(msg);
addDiagnostic(msg);
finished(DAGState.FAILED);
return DAGState.FAILED;
}
}
}
TEZ 소스는 DAGImpl 코드에서 확인할 수 있습니다.
반응형
'빅데이터 > hive' 카테고리의 다른 글
[hive] explain을 이용하여 CBO 적용 여부 확인 (0) | 2019.04.05 |
---|---|
[hive] TEZ엔진의 리듀서 처리중 셔플 단계의 OutOfMemoryError: Java heap space 오류 처리 (0) | 2019.04.05 |
[hive] 하이브 처리 결과를 gzip으로 압축하는 방법 (0) | 2019.04.03 |
[hive] MSCK REPAIR 처리중 Caused by: MetaException(message:Expected 2 components, got 1) 처리 (0) | 2019.04.01 |
[hive] 테이블의 파티션을 범위로 삭제(Drop)하는 방법 (0) | 2019.04.01 |