Spark에서 클러스터 매니저로 YARN을 사용하고 있는데, 배포 방식에 따른 차이(리소스 할당 등) 때문에 위 글을 작성하게 되었다.
0. Cluster Mode? Manager가 뭐야?
Cluster Manager란?
여러 대의 서버로 구성된 클러스터 환경에서 Spark 애플리케이션이 실행되는 컴퓨터 클러스터의 리소스(Driver와 Executor사이의 자원)를 관리하는 시스템이다. Cluster Manager는 Spark 애플리케이션의 다양한 작업 및 단계에 CPU, 메모리 및 네트워크 대역폭과 같은 리소스를 할당하고 이러한 작업의 실행을 모니터링하여 성공적으로 완료되었는지 확인하는 역할을 한다.
배포 방식은 Client mode와 Cluster mode 2가지 이다.
드라이버 프로그램이 지역적으로 실행될지(client) 클러스터의 작업 머신들 중에서 실행될지(cluster)를 결정한다.
- Client mode (기본값)
- driver가 클러스터 외부에 있다. 즉, spark-submit이 드라이버를 자신이 실행되는 머신 위에서 실행된다.
- Application Master는 단순히 노드 매니저에게 자원 요청만 하고
Spark 애플리케이션에서 사용 중인 리소스를 표시하기 때문에, 주로 개발과정에서 대화형 디버깅을 할 때 의미가 있다.
- Cluster mode
- driver가 클러스터 내부에 있기 때문에, 클러스터의 작업 노드에서 실행되도록 드라이버를 전송한다.
- dirver가 Application Master 상에서 동작하기 때문에, 사용하는 리소스를 worker node에서 확인을 해야한다.
- production 환경 개발을 할때 의미가 있다.
1.deploy mode 변경 이유 : client -> cluster
client mode가 defalut이긴 하나, client mode로 여러 잡을 동시에 돌리면 서버에 부하가 늘어나 cluster mode로 배포하기를 권장하고 있다. 하지만 cluster 모드에서는 클라이언트 머신 위에서 driver 프로세스가 안 떠서 메시지를 바로 확인할 수 없기 때문에 아래 3번과 같은 방법으로 메세지를 확인해야하는 번거로움이 있다.
때문에 디버깅이 자주 필요한 잡들은 에러 메세지 확인 용이성 등의 이유로 client mode로 배포한 후 최종 검증이 끝난 후 cluster mode로 변경하여 배포를 하는 편으로 작업을 진행하고 있다.
2.변경하는 방법 (spark-submit지정)
--deploy-mode client는 기본값이기 때문에 생략가능하다.
# spark-submit \
--master yarn \
--deploy-mode client # --deploy-mode cluster
3. cluster mode일때, spark 웹 콘솔에서 드라이버 프로세스(로그) 확인하는 방법
- App ID 확인 방법
- sc.getConf().get(‘spark.ui.proxyBase’)
- 모니터링 대시보드 툴( 키바나, 그라파나, 크로노그래프 등)
- spark-ui에서 드라이버 프로세스 확인
- 실행 중인 경우 : hadoop 웹 콘솔의 애플리케이션 정보>spark 웹 콘솔 > 해당 App ID의 Tracking UI > Executors > stdout 확인
- 종료된 경우 : hadoop 웹 콘솔의 애플리케이션 정보 > spark history 웹 콘솔(/history/{App_ID})> Executors > stdout 확인
참고 사항)
- client모드인 경우는 stdout 버튼이 활성화 되지 않는다.
- cluster모드에서는 app_name을 따로 명령어에서 설정해야 확인가능하다.(하단 참고)
- spark 콘솔에 Streaming 메뉴는 Spark Streaming Application을 실행한 경우에만 생성 된다.
4. 결론
cluster mode 간의 선택은 실행 중인 Spark 애플리케이션의 특정 요구 사항에 따라 달라지게 된다. client 및 cluster의 배포 방법에는 Spark 애플리케이션의 크기 및 복잡성, 사용 가능한 리소스 및 실행 프로세스에 대한 원하는 제어 수준과 같은 요소에 따라 달라지게 되므로 이를 잘 고려해서 배포를 진행해야 한다.
1. Yarn-Cluster 모드에서 제출된 Spark 애플리케이션의 이름이 적용되지 않는 이유는 무엇입니까?
그 이유는 Yarn-클라이언트 모드에서 제출된 작업의 setAppName 실행 순서가 Yarn-Cluster 모드에서 제출된 것과 다르기 때문입니다. 얀-클라이언트 모드에서는 애플리케이션이 얀에 등록되기 전에 setAppName을 읽습니다. 그러나 얀-클러스터 모드에서는 애플리케이션이 얀에 등록된 후에 setAppName을 읽으므로 두 번째 애플리케이션의 이름이 적용되지 않습니다.
참고
1.Yarn Cluster로 Spark-submit 실행시 --deploy-mode 실행 확인 - khstar
2.[Spark] Spark 구조 및 실행 흐름 -우노
3. spark cluster 환경 정리 - lucaskim
4. https://spark.apache.org/docs/latest/cluster-overview.html
5. https://spark.apache.org/docs/latest/submitting-applications.html#master-urls
'개발 > Spark' 카테고리의 다른 글
[Spark] Parquet 파일을 읽는 동안 Dataframe의 메타데이터 변경 에러 (0) | 2023.07.16 |
---|---|
[Spark DEBUG] partiton path load 오류 (0) | 2023.02.26 |
[Spark DEBUG] Refresh for Dataframe while reading file 오류 (0) | 2022.11.16 |
[spark] Build step 'Execute shell' marked build as failure 권한 오류 (Permission denied) (0) | 2022.10.05 |
Spark 이해하기(RDD, DAG, Lazy Evaluation) (0) | 2022.02.07 |