2013-11-04 2 views
0

맵퍼는 맵퍼가 완료되면 일부 데이터를 로컬 디스크에 기록하고 정리합니다. 그러나 오류가 발생하면 cleanup() 메서드가 호출되지 않습니다 (예외가 발생 함). 내 매퍼에서 예외를 catch 할 수 있지만 내 매퍼 (예 : 대기 노드로 작업 추적기 장애 조치)에서 호출되지 않은 예외를 처리 할 수 ​​없습니다.실패한 맵을 정리하십시오.

매퍼가 실패 할 때 정리할 수있는 방법이 있습니까?

+0

내가 확실하지 오전 파일 시스템 클래스를 사용하여 무엇을 임시 파일의 위치를 ​​알 수 있습니다. 즉, mapred.local.dir에 지정되어 있으므로 제거하면 계획 B가됩니다. 일반적으로 작업이 완료되면 정리가 수행되지만 문제가 발생하면 수행해야 할 수도 있습니다 수동으로. 데몬이 아직 살아 있다면 namenode를 시도하고 포맷 할 수 있습니다. – DDW

+0

내 매퍼는 HDFS가 아닌 로컬 디스크 (실제로는 RAMDisk)에 데이터를 씁니다. 매퍼는 자체로 작성된 파일을 삭제해야합니다. – avhacker

답변

2

당신은 문맥에서 입력 키의 반복 주위에 시도/캐치를 포함하는 매퍼의 실행 방법을 무시하고 그 정리가 호출 될 수 있도록 할 수 있습니다

@Override 
public void run() { 
    setup(context); 

    try { 
    while (context.nextKeyValue()) { 
     map(context.getCurrentKey(), context.getCurrentValue(), context); 
    } 
    } finally { 
    cleanup(context); 
    } 
} 

당신이 있는지 확인해야합니다 당신의 정리 메소드는 레코드를 시도하고 출력하기위한 논리가 없으며 오류가 발생했음을 나타 내기 위해 맵퍼에 플래그를 설정합니다.

이것은 모든 유형의 작업 실패 (예 : JVM 충돌)를 막을 수는 없지만 다른 방법은 없을 것이라고 생각합니다. 사용 된 리소스가 올바르게 정리됩니다. 작업이 디렉토리가 로컬 파일 시스템에있는 경우에도, 완료하면 당신은 확실히 일부 폴더를 삭제할 수 있습니다 작업 클래스를 사용

+0

+1 추천! – DDW

관련 문제