복붙노트

[HADOOP] 손상된 입력 파일에서 hadoop 작업이 실패하는 것을 방지하는 방법

HADOOP

손상된 입력 파일에서 hadoop 작업이 실패하는 것을 방지하는 방법

나는 많은 입력 파일들에 대해 hadoop 작업을 수행하고있다. 그러나 파일 중 하나가 손상되면 전체 작업이 실패합니다.

손상된 파일을 무시하도록 작업을 어떻게 만들 수 있습니까? 어쩌면 나를 위해 카운터 / 오류 로그를 작성하지만 전체 작업을 실패하지 않습니다.

해결법

  1. ==============================

    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. ==============================

    2.이것은 장애가있는 트랩이 계단식으로 사용되는 것입니다.

    이것은 장애가있는 트랩이 계단식으로 사용되는 것입니다.

    근본적으로 작업이 계속 진행되며 나중에 손상된 파일을 확인할 수 있습니다.

    흐름 정의 문에서 계단식으로 익숙하다면 :

        new FlowDef().addTrap( String branchName, Tap trap );
    

    실패 트랩

  3. ==============================

    3.또 다른 가능한 방법이 있습니다. mapred.max.map.failures.percent 구성 옵션을 사용할 수 있습니다. 물론이 문제를 해결하는이 방법은지도 단계에서 발생하는 다른 문제를 숨길 수 있습니다.

    또 다른 가능한 방법이 있습니다. mapred.max.map.failures.percent 구성 옵션을 사용할 수 있습니다. 물론이 문제를 해결하는이 방법은지도 단계에서 발생하는 다른 문제를 숨길 수 있습니다.

  4. from https://stackoverflow.com/questions/14920236/how-to-prevent-hadoop-job-to-fail-on-corrupted-input-file by cc-by-sa and MIT license