spark stream을 구현하면서 사용한 옵션을 정리합니다.
.config("spark.ui.port", "50001")
//포트 설정
.config("spark.sql.shuffle.partitions", "1")
// 기본값 200개를 1개로 줄임
옵션 설명
spark.ui.port : spark driver가 뜰 UI port를 설정합니다. spark standalone 모드인 경우 default port부터 숫자가 하나씩 증가하면서 할당받습니다. 여러 개의 app을 실행하다 보면 UI Port를 할당받지 못하기도 하는데요. port를 할당받지 못해도 spark가 실행되는 데는 문제없습니다. UI 없이 그냥 job이 실행되고 잘 종료합니다. spark 실행될 때 로그를 잘 보면 port가 이미 사용되고 있다는 로그가 뜨다가 실행된 port정보를 알려줍니다.
spark실행에 대한 대부분의 정보를 로그를 보는것으로 파악할 수 있습니다. 에러 로그도 뜨고 어느 단계를 진행 중인지 파악하는 데 사용됩니다. 하지만 DAG그래프를 보면서 어느 시각 적으로 어느 단계를 실행 중인지 파악하기 위해서는 웹 UI가 나름 편리합니다. 단계별로 동작한 시간들을 보면서 어느 단계를 튜닝해야 하는지 직감적으로 파악할 수 있고 테스크가 너무 많거나 데이터가 몰려 있는데 한눈으로 파악할 수 있기 때문에 유용하게 사용할 수 있습니다.
주로 개발 단계에서 동작하는것을 목표로 실행할 때는 로그를 보고 튜닝하면서 전체적인 성능 개선을 볼 때는 UI를 보게 됩니다.
spark.sql.shuffle.partitions : 제가 개발하던 작업은 데이터가 작은데 기본 셔플값을 200을 가지고 있었습니다. stream 특성에 따라 속도 개선을 위해 불필요한 작업을 없애야 할 때가 있습니다. 제 job의 경우 200개의 셔플을 하게 되면서 아무 작업을 안 하지만 셔플을 위해 코어를 할당받고 0개의 작업을 처리하고 반환하는 빈 작업을 하는 걸 파악했습니다. 약 10초에서 20초를 이 작업을 하는 데 사용되는걸 spark UI를 통해 확인할 수 있었습니다. 0개가 가능한지 테스트는 안 해봤는데 필요 없는 작업은 1개로 줄여서 전체 job의 속도 개선을 할 수 있었습니다.