무거운 Zeppelin Application이 리소스를 장기간 점유하는 문제해결

: spark.dynamicAllocation 관련 IdleTimeout 설정


a. 환경

spark 2.1.1, zeppelin 0.8.0(pyspark 사용)

b. 의문현상

아래와 같이 yarn 리소스 메니저에서 보시면 최상단에 있는 제플린 어플리케이션에서 구동시킨 app 이 구동 완료 후에도 장시간 자원을 계속 점유 하고 있었습니다.

제플린이 스파크컨텍스트를 설정에 따라 공유/재사용 하는 컨셉을 유지하는 것은 이해가 가나, 실행완료하기 위해 사용한 리소스를 장시간 계속 점유 하고 있는 건 납득이 가지 않았어요.

zeppelin-idle-timeout-1

c. 문제 어플리케이션 내용

예를 들어 아래와 같이 pyspark 로 파케이 파일을 읽어와 spark.sql 로 쿼리를 날리는 간단한 내용입니다.

zeppelin-idle-timeout-3

d. 문제 해결시도

  • 메모리 해제나 임시 테이블 쪽에 문제가 있나 싶어서 임시테이블을 사용하지 않도록 해도 마찬가지로 동일한 문제가 발생했습니다.
  • sc.stop() 으로 명시적으로 app을 죽이면 바로 리소스메니저에서 제외되나 zeppelin 에서 spark 인터프리터 자체가 죽어버려서 수동으로 다시 재시작 해줘야 하는 문제가 있습니다. (이게 여전히 해당 제플린 버전의 버그로 느껴짐)

e. 문제 해결

스사모 에 해당 상황에 대해 질문을 했고, Spark Dynamic Allocation 옵션에 대한 언급이 있어서 리퍼런스를 찾아보니, spark.dynamicAllocation.cachedExecutorIdleTimeout 설정값이 기본이 무한대 값이라는 것이 문제일 수 있다고 생각됐어요.

제플린이 특정 노트북페이지에서 순차적으로 특정 명령어를 실행하고 그 결과를 보여주는 흐름을 보여주는 데, 예를 들어 특정 명령어가 persist 나 view 테이블을 생성하는 명령어로 메모리를 크게 잡은 상태에서 사용자가 페이지를 나가버리거나 하면 계속 제플린 어플리케이션이 자원을 잡고 있는 상황이 발생하는 거지요.

결국 spark.dynamicAllocation 관련 설정들을 아래와 같이 제플린에서 확인하니, 해당 설정이 빠져있는 것을 발견하고 제플린 인터프리터에 설정 해주는 것으로 문제 해결했습니다.

제플린 spark 인터프리터에서 설정/재설정 해준 값은 아래와 같습니다.

참고

Spark Configuration
Spark Job Scheduling

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑