[HADOOP] 손상된 입력 파일에서 hadoop 작업이 실패하는 것을 방지하는 방법
HADOOP손상된 입력 파일에서 hadoop 작업이 실패하는 것을 방지하는 방법
나는 많은 입력 파일들에 대해 hadoop 작업을 수행하고있다. 그러나 파일 중 하나가 손상되면 전체 작업이 실패합니다.
손상된 파일을 무시하도록 작업을 어떻게 만들 수 있습니까? 어쩌면 나를 위해 카운터 / 오류 로그를 작성하지만 전체 작업을 실패하지 않습니다.
해결법
-
==============================
1.그것은 당신의 작업이 실패한 곳에 달려 있습니다 - 라인이 손상되어 맵 메서드의 어딘가에 예외가 발생하면 try / catch를 사용하여 맵 메서드의 본문을 래핑하고 오류를 로그 할 수 있어야합니다 :
그것은 당신의 작업이 실패한 곳에 달려 있습니다 - 라인이 손상되어 맵 메서드의 어딘가에 예외가 발생하면 try / catch를 사용하여 맵 메서드의 본문을 래핑하고 오류를 로그 할 수 있어야합니다 :
protected void map(LongWritable key, Text value, Context context) { try { // parse value to a long int val = Integer.parseInt(value.toString()); // do something with key and val.. } catch (NumberFormatException nfe) { // log error and continue } }
하지만 InputFormat의 RecordReader에서 오류가 발생하면 매퍼 실행 (..) 메서드를 수정해야합니다. 기본 구현은 다음과 같습니다.
public void run(Context context) { setup(context); while (context.nextKeyValue()) { map(context.getCurrentKey(), context.getCurrentValue(), context); } cleanup(context); }
그래서 이것을 수정하여 context.nextKeyValue () 호출에서 예외를 잡을 수는 있지만 독자가 던진 오류는 무시해야합니다. 예를 들어 IOExeption은 오류를 무시하여 '건너 뛸 수있는'것이 아닙니다. .
자신의 InputFormat / RecordReader를 작성했고 레코드 실패를 나타내지 만 특정 레코드를 건너 뛰고 구문 분석을 계속할 수있는 예외가있는 경우 다음과 같이 작동합니다.
public void run(Context context) { setup(context); while (true) { try { if (!context.nextKeyValue()) { break; } else { map(context.getCurrentKey(), context.getCurrentValue(), context); } } catch (SkippableRecordException sre) { // log error } } cleanup(context); }
하지만 다시 작성하기 만하면 RecordReader가 오류를 복구 할 수 있어야합니다. 그렇지 않으면 위 코드가 무한 루프로 전환 될 수 있습니다.
특정 경우에 대해 - 첫 번째 실패시 파일을 무시하려는 경우 run 메소드를 훨씬 간단하게 업데이트 할 수 있습니다.
public void run(Context context) { setup(context); try { while (context.nextKeyValue()) { map(context.getCurrentKey(), context.getCurrentValue(), context); } cleanup(context); } catch (Exception e) { // log error } }
경고의 최종 단어 :
-
==============================
2.이것은 장애가있는 트랩이 계단식으로 사용되는 것입니다.
이것은 장애가있는 트랩이 계단식으로 사용되는 것입니다.
근본적으로 작업이 계속 진행되며 나중에 손상된 파일을 확인할 수 있습니다.
흐름 정의 문에서 계단식으로 익숙하다면 :
new FlowDef().addTrap( String branchName, Tap trap );
실패 트랩
-
==============================
3.또 다른 가능한 방법이 있습니다. mapred.max.map.failures.percent 구성 옵션을 사용할 수 있습니다. 물론이 문제를 해결하는이 방법은지도 단계에서 발생하는 다른 문제를 숨길 수 있습니다.
또 다른 가능한 방법이 있습니다. mapred.max.map.failures.percent 구성 옵션을 사용할 수 있습니다. 물론이 문제를 해결하는이 방법은지도 단계에서 발생하는 다른 문제를 숨길 수 있습니다.
from https://stackoverflow.com/questions/14920236/how-to-prevent-hadoop-job-to-fail-on-corrupted-input-file by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] PIG의 모든 레코드 집합에 대한 최대 / 최소 (0) | 2019.07.12 |
---|---|
[HADOOP] mapred.reduce.parallel.copies를 조정하는 방법? (0) | 2019.07.12 |
[HADOOP] Hadoop Mapreduce 프로그램의 출력을 프로그래밍 방식으로 읽음 (0) | 2019.07.12 |
[HADOOP] Oozie SSH 액션 (0) | 2019.07.12 |
[HADOOP] Spark는 원사 클러스터 exitCode = 13에서 실행됩니다. (0) | 2019.07.12 |