Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Archives
Today
Total
관리 메뉴

복싱하는_개발자.dev

[Spark] spark 작업 시 Java OOM(Out Of Memory) ERROR 처리 본문

Spark

[Spark] spark 작업 시 Java OOM(Out Of Memory) ERROR 처리

개복자 2022. 3. 16. 11:13

스파크 작업 도중에 가장 많이 보는 에러라고 하면 단연코 Java GC 관련 에러가 아닐까 싶다... 

 java.lang.OutOfMemoryError: GC overhead limit exceeded

 

보통 스파크 내에서 데이터 프레임 작업이 아닌, 해당 데이터 프레임들을 RDD로 변환 시켜서 사용 될 때, 메모리를 너무 많이 사용하게 되면서 발생하는 에러이다.

이 때는 작업이 죽지도 않고, pending 되어 계속 자원을 가지고 있는 경우가 많아서 이후 작업들에도 영향력이 상당하다.

 

사실 이 에러를 정확하게 처리하기 위해서는 데이터프레임 >> RDD 로 변환되는 작업들을 줄이는 것이 좋지만 로직 상 어쩔 수 없다면 

spark-submit 옵션 중 driver-memory를 늘려 주어야 한다. 

 

spark 옵션에는 executor / driver 의 memory, core 를 변경할 수 있는 옵션이 있다. 

실질적으로 연산을 수행하는 것은 말 그대로 executor 가 담당한다. executor의 memory, core option이 어느정도 커진다면 스파크 작업의 수행이 빨라질 수 있다. (사용하는 데이터의 크기와 자원을 고려해야한다!)

 

driver는 SparkContext를 생성하고 RDD를 만들고 트랜스포메이션과 액션을 실행하는 사용자 코드를 실행하는 프로세스이다. 

스파크 작업을 돌리는 순간, driver 가 생성된다. 

 

스파크 옵션 의미 기본값 가이드라인
spark.driver.memory 하나의 driver에서 Task를 실행하는 데 사용하는 (가상) 코어 개수 1024 mb 데이터 프레임이 아닌 RDD 변경 하는 작업이 크거나 많은 경우 늘려주는 것이 좋다. 
또한 한번에 큰 데이터를 많이 읽는 경우에도 driver-memory의 증가가 필요하다.
spark.driver.cores 하나의 driver 에서 Task를 실행하는 데 사용하는 (가상) 코어 개수 1  
spark.executor.memory 하나의 executor에서 Task를 실행하는 데 사용하는 메모리 크기 1024 mb 큰 데이터프레임끼리의 SQL 작업, 코드 내에서 중간 산출물이 많고, 산출물들을 계속해서 써야하는 경우 memory를 증가시켜야 한다.
spark.executor.cores 하나의 executor에서 Task를 실행하는 데 사용하는 (가상) 코어 개수 1 executor 의 코어수는 5개 전후로 설정 하는것을 추천.

 

 

 

 

Comments