Spark 애플리케이션 디버깅 TIPS

4587 단어 스파크EMRAWS

Spark UI에서 스레드 덤프 보기



어딘가에서 막히는/교착 상태 등을 확인하고 싶다면 스레드 덤프를 보는 것이 효과적이지만, 그냥 Spark UI에서 할 수 있습니다.





EMR에서 JMX 원격 디버깅



여기서 jvisualvm을 사용하기로 결정합니다.

jvisualvm 준비



jvisualvm에 플러그인을 넣어두면 버립니다.
Tools > Plugins에서 플러그인 관리 화면을 열고 Threads Inspector 당 넣어두면 편리합니다.

단계 추가



전제


  • 응용 프로그램이 항아리에 고정되어 s3://path/to/app.jar에 있다고 가정합니다
  • .
  • command-runner.jar에서 spark-submit하는 방법으로 단계를 수행합니다
  • EMR 클러스터의 master 및 각 노드는 22번이 비어 있어야 합니다

  • EMR에 단계 추가



    다음과 같은 명령줄 옵션을 사용하여 단계를 추가합니다.
    spark-submit --deploy-mode cluster --class com.example.Main --master yarn-cluster \
      --conf "spark.executor.extraJavaOptions=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8002 -Dcom.sun.management.jmxremote.rmi.port=8002 -Djava.rmi.server.hostname=127.0.0.1" \
      --conf "spark.driver.extraJavaOptions=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8003 -Dcom.sun.management.jmxremote.rmi.port=8003 -Djava.rmi.server.hostname=127.0.0.1" \
      --num-executors 3 --driver-memory 2g --executor-memory 5g --executor-cores 2 \ # このへんはお好みで
      s3://path/to/app.jar
    

    이제 드라이버 프로세스의 경우 8003, executor 프로세스의 경우 8002에서 jmx에 연결할 수 있습니다.

    이번에는 executor 프로세스에 연결해 보겠습니다.

    ※주의

    하나의 노드에서 여러 executor를 할당 할 수있는 설정으로 실행하면 8002가이를 배팅 할 수 있습니다.

    그러한 경우는 com.sun.management.jmxremote.port=0로서, 동적으로 포트를 취득하는 등의 수단을 취할 필요가 있습니다.

    executor 프로세스가 실행되는 노드 식별



    YARN 클러스터의 어느 노드에서 executor가 실행되는지는 동적으로 결정되므로 각 노드에 SSH로 들어가 lsof 등에서 8002 번이 사용되고 있는지 확인하고 연결하는 노드를 확인합니다.

    여기서는 ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com라고 가정합니다.

    SSH 터널 열기



    머신에서 다음 명령을 실행하여 8002번 SSH 터널을 엽니다.
    $ ssh -i key.pem -NL 8002:ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8002 [email protected]
    

    jvisualvm에서 연결



    나머지는 127.0.0.1:8002에 대해 jvisualvm에서 연결하면 OK입니다.

    IntelliJ에서 단계 실행(local 모드)



    IntelliJ의 원격 디버깅을 사용하면 Spark 애플리케이션을 단계별로 실행할 수 있습니다.

    여기에서는 local 모드로 실시합니다. (EMR상에서도 할 수 있을 것입니다만)

    전제


  • spark 바이너리를 떨어 뜨려 /path/to/spark_home에 압축을 풉니 다
  • 응용 프로그램은 항아리에 굳어 /path/to/app.jar에 둡니다

  • IntelliJ 사전 준비



    IntelliJ를 시작하고 Run > Edit Configurations에서 원격 디버깅을 위한 구성을 추가합니다.


    +에서 Remote를 선택하면 마음대로 이것이 입력되고 있습니다.

    spark-submit



    원격 디버깅 옵션을 사용하여 spark-submit합니다.
    $ cd /path/to/spark_home
    $ ./bin/spark-submit --master local \
        --driver-java-options "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" \
        /path/to/app.jar
    

    IntelliJ에서 원격 디버깅 시작



    조금 지나 Spark 응용 프로그램이 시작되면 방금 만든 configuration을 실행하면 평소와 같이 중단 점을 붙이거나 스레드 상태를 보거나 watch를 넣을 수 있습니다.

    좋은 웹페이지 즐겨찾기