Spark 애플리케이션 디버깅 TIPS
Spark UI에서 스레드 덤프 보기
어딘가에서 막히는/교착 상태 등을 확인하고 싶다면 스레드 덤프를 보는 것이 효과적이지만, 그냥 Spark UI에서 할 수 있습니다.
EMR에서 JMX 원격 디버깅
여기서 jvisualvm을 사용하기로 결정합니다.
jvisualvm 준비
jvisualvm에 플러그인을 넣어두면 버립니다.
Tools > Plugins
에서 플러그인 관리 화면을 열고 Threads Inspector 당 넣어두면 편리합니다.단계 추가
전제
s3://path/to/app.jar
에 있다고 가정합니다 command-runner.jar
에서 spark-submit
하는 방법으로 단계를 수행합니다 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상에서도 할 수 있을 것입니다만)
전제
/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를 넣을 수 있습니다.
Reference
이 문제에 관하여(Spark 애플리케이션 디버깅 TIPS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ocadaruma/items/e84a12697b575731adf6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)