Spark executor 에 메모리가 부족해지는 경우

오영주·2022년 9월 20일
2
post-thumbnail

Spark executor 에 메모리가 부족해지는 경우 (Spark executor runs out of memory)

Spark executor 에서 메모리가 부족할 경우 yarn 은 자동적으로 이 잡을 죽여버린다.
이때에 worker 의 log 를 보면 "Container killed on request. Exit code is 137" 이라는 메시지가 남게 되고, executor 의 stdout까지 잘 살펴보면 "java.lang.OutOfMemoryError: Java heap space" 이런 메시지가 있단걸 확인할 수 있다.

해결방법

  1. driver 나 executor 의 메모리를 늘린다.
  • 어떤 container 가 이 에러를 발생시켰는지를 확인해서 spark.executor.memory 혹은 spark.driver.memory의 parameter 값을 튜닝한다.
  • emr 이라면 master node 에 접속해서, /etc/spark/conf/spark-defaults.conf 에서 해당 값들을 수정한다.
  • 하나의 잡에 대해서만 늘리고 싶다면, 해당 잡을 spark submit 할때에 spark.executor.memory 혹은 spark.driver.memory의 값들을 수정한다.
  • 근데 만약 node 에서 이미 maximizeResourceAllocation 등의 옵션을 쓰고 있다면 이런 조치를 취할 수 없다.
  1. Spark partition 을 늘린다.
  • partition 의 수를 늘리면 하나의 spark task 에서 처리하는 데이터의 양이 줄어들게 되므로, 하나의 executor 가 소모하는 메모리의 양이 줄어들게 된다.
  • partition 의 수를 늘리고 그 수에 의해 repartition 하게 하면 된다.
    val numPartitions= 500
    val newDF=df.repartition(numPartitions)
  • 만약 이 에러가 join, groupby 등의 wide transformation 과정에서 발생하는 것 이라면 shuffle partition 의 수를 늘린다. (default 값은 200이다)
    • emr 이라면 master node 에 접속해서, /etc/spark/conf/spark-defaults.conf 에서 spark.sql.shuffle.partitions의 값을 200이상으로 바꿔주거나
    • spark submit 할때에 해당 parameter 를 바꿔주면 된다.
  1. executor 의 core 수를 줄인다.
  • executor 의 core 수를 줄이면 하나의 executor 에서 동시에 돌아가는 task 의 수가 줄어들기때문에 사용되는 메모리가 줄어들게 된다.
    • emr 이라면 master node 에 접속해서, /etc/spark/conf/spark-defaults.conf 에서 spark.executor.cores의 값을 줄여주거나,
    • spark submit 할때에 해당 parameter 를 바꿔주면 된다.
profile
data scientist

0개의 댓글