복붙노트

[HADOOP] 일식에서 hadoop mapreduce 작업을 디버깅하는 방법?

HADOOP

일식에서 hadoop mapreduce 작업을 디버깅하는 방법?

나는 단일 기계, 로컬 전용 설정에서 hadoop을 실행 중이며 일식에서 매퍼 (mappers)와 감속기를 디버그하기위한 좋은, 고통없는 방법을 찾고있다. Eclipse는 mapreduce 작업을 실행하는 데 아무런 문제가 없습니다. 그러나 디버깅 할 때이 오류가 발생합니다.

좋아, 그래서 나는 약간의 연구를한다. 분명히, 나는 이클립스의 원격 디버깅 기능을 사용해야하고 이것을 내 hadoop-env.sh에 추가해야한다.

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000

나는 그것을하고 일식 내 코드를 통해 단계 수 있습니다. 문제는 "suspend = y"때문에 명령 줄에서 "hadoop"명령을 사용하여 작업 대기열을 확인하는 것과 같은 작업을 수행 할 수 없다는 것입니다. 디버거가 붙기를 기다리고 있기 때문에 상상할 수 있습니다. 또한, 나는 아마 같은 이유로이 모드에있을 때 "hbase shell"을 실행할 수 없습니다.

그래서 기본적으로 "디버그 모드"와 "일반 모드"를 앞뒤로 돌리고 싶다면 hadoop-env.sh를 업데이트하고 컴퓨터를 다시 시작해야합니다. 중대한 통증. 그래서 몇 가지 질문이 있습니다.

여기 내 메인 클래스입니다 :

public class Main {
      public static void main(String[] args) throws Exception {     
        Job job = new Job();
        job.setJarByClass(Main.class);
        job.setJobName("FirstStage");

        FileInputFormat.addInputPath(job, new Path("/home/sangfroid/project/in"));
        FileOutputFormat.setOutputPath(job, new Path("/home/sangfroid/project/out"));

        job.setMapperClass(FirstStageMapper.class);
        job.setReducerClass(FirstStageReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
}

해결법

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

    1./ bin / hadoop (hadoop-env.sh) 스크립트에서 변경하십시오. 해고 된 명령을 확인하십시오. 명령이 jar이면 원격 디버그 구성 만 추가하십시오.

    / bin / hadoop (hadoop-env.sh) 스크립트에서 변경하십시오. 해고 된 명령을 확인하십시오. 명령이 jar이면 원격 디버그 구성 만 추가하십시오.

    if [ "$COMMAND" = "jar" ] ; then
      exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
    else
      exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
    fi
    
  2. ==============================

    2.Eclipse에서 hadoop을 디버그 할 수있는 유일한 방법은 로컬 모드에서 hadoop을 실행하는 것입니다. 그 이유는 각 맵이 ist 자신의 JVM에서 실행되는 작업을 줄이고 로컬 모드에서 hadoop을 수행하지 않으면 eclipse가 디버그 할 수 없기 때문입니다.

    Eclipse에서 hadoop을 디버그 할 수있는 유일한 방법은 로컬 모드에서 hadoop을 실행하는 것입니다. 그 이유는 각 맵이 ist 자신의 JVM에서 실행되는 작업을 줄이고 로컬 모드에서 hadoop을 수행하지 않으면 eclipse가 디버그 할 수 없기 때문입니다.

    hadoop을 로컬 모드로 설정하면 hdfs API (기본값)를 사용하는 대신 hadoop 파일 시스템이 file : ///으로 변경됩니다. 따라서, hadoop fs -ls를 실행하는 것은 hdfs 명령이 아니라, 로컬 디렉토리에 대한 경로 인 hadoop fs -ls file : ///을 더 많이 사용하게됩니다. JobTracker 또는 NameNode가 실행되지 않습니다.

    이 블로그 포스트는 도움이 될 수 있습니다 :

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

    3.Jumbune의 디버거는 최소한의 노력으로이 모든 작업을 수행합니다.

    Jumbune의 디버거는 최소한의 노력으로이 모든 작업을 수행합니다.

    디버거는 MapReduce 작업의 코드 레벨 제어 흐름 통계를 제공합니다.

    사용자는 regex 유효성 검사 또는 자체 사용자 정의 유효성 검사 클래스를 적용 할 수 있습니다. 적용된 검증에 따라, Flow Debugger는 매퍼 (mapper) 및 감속기 (reducer)에 대한 데이터 흐름을 각각 점검합니다.

    또한 입력 레코드의 흐름이 작업 레벨, MR 레벨 및 인스턴스 레벨에서 표시되는 포괄적 인 테이블 / 차트보기를 제공합니다. 일치하지 않는 키 / 값은 작업 실행 결과의 잘못된 키 / 값 데이터 수를 나타냅니다. 디버거는 루프 및 조건 if, else-if 등과 같은 다양한 카운터에 대한 데이터 흐름을 검사하기 위해 코드를 드릴 다운합니다.

    Jumbune은 오픈 소스이며 www.jumbune.org 및 https://github.com/impetus-opensource/jumbune에서 구할 수 있습니다.

  4. ==============================

    4.권장 MRUnit 외에도 나는 Eclipse로 디버깅하는 것을 좋아한다. 나는 주된 프로그램을 가지고있다. Configuration을 인스턴스화하고 MapReduce 작업을 직접 실행합니다. 난 그냥 표준 일식 디버그 구성으로 디버깅. 내 mvn 스펙에 hadoop 항아리가 포함되어 있기 때문에 모든 클래스 경로에 hadoop을 모두 가지고 있으며 설치 한 hadoop에 대해 실행할 필요가 없습니다. 저는 항상 로컬 디렉토리에있는 작은 데이터 세트를 테스트하여 작업하기 쉽습니다. 구성의 기본값은 독립 실행 형 hadoop (파일 시스템을 사용할 수 있음)

    권장 MRUnit 외에도 나는 Eclipse로 디버깅하는 것을 좋아한다. 나는 주된 프로그램을 가지고있다. Configuration을 인스턴스화하고 MapReduce 작업을 직접 실행합니다. 난 그냥 표준 일식 디버그 구성으로 디버깅. 내 mvn 스펙에 hadoop 항아리가 포함되어 있기 때문에 모든 클래스 경로에 hadoop을 모두 가지고 있으며 설치 한 hadoop에 대해 실행할 필요가 없습니다. 저는 항상 로컬 디렉토리에있는 작은 데이터 세트를 테스트하여 작업하기 쉽습니다. 구성의 기본값은 독립 실행 형 hadoop (파일 시스템을 사용할 수 있음)

  5. ==============================

    5.나는 또한 유닛 테스트 w / MRUnit을 통해 디버그하고 싶다. 나는 이것을 Map Reduce 프로세스의 쉬운 시각화를 생성하는 승인 테스트와 함께 사용하고, 실패한 시나리오를 쉽게 전달할 수 있도록 할 것입니다. 그것은 또한 이클립스에서 원활하게 실행됩니다.

    나는 또한 유닛 테스트 w / MRUnit을 통해 디버그하고 싶다. 나는 이것을 Map Reduce 프로세스의 쉬운 시각화를 생성하는 승인 테스트와 함께 사용하고, 실패한 시나리오를 쉽게 전달할 수 있도록 할 것입니다. 그것은 또한 이클립스에서 원활하게 실행됩니다.

    예 :

    HadoopApprovals.verifyMapReduce(new WordCountMapper(), 
                             new WordCountReducer(), 0, "cat cat dog");
    

    출력을 생성합니다.

    [cat cat dog] 
    -> maps via WordCountMapper to ->
    (cat, 1) 
    (cat, 1) 
    (dog, 1)
    
    -> reduces via WordCountReducer to ->
    (cat, 2) 
    (dog, 1)
    

    이 과정의 비디오는 다음과 같습니다. http://t.co/leExFVrf

  6. ==============================

    6.hadoop의 내부 java 명령에 args를 추가하는 것은 HADOOP_OPTS env 변수를 통해 수행 할 수 있습니다 :

    hadoop의 내부 java 명령에 args를 추가하는 것은 HADOOP_OPTS env 변수를 통해 수행 할 수 있습니다 :

    export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5005,suspend=y"
    
  7. from https://stackoverflow.com/questions/9915808/how-to-debug-hadoop-mapreduce-jobs-from-eclipse by cc-by-sa and MIT license