본문 바로가기
Big Data/Apache Spark

[Spark] Spark & ulimit error

by seaweed_one 2023. 10. 15.
728x90

리눅스 환경에서 spark job 실행 중 파일 관련 에러가 발생했습니다.

[ERROR] 2023-10-04 16:55:02.419 [ 205] - Exception in task 6.0 in stage 15.0 (TID 115)
java.io.FileNotFoundException: /tmp/blockmgr-e08af927-6eba-4f73-9857-5811f088c13e/38/temp_shuffle_68c81ce9-02d6-4f80-9e46-a8e3f1a0cfa1 (Too many open files)
at java.io.FileOutputStream.open0(Native Method) ~[?:1.8.0_192]
at java.io.FileOutputStream.open(FileOutputStream.java:270) ~[?:1.8.0_192]
at java.io.FileOutputStream.<init>(FileOutputStream.java:213) ~[?:1.8.0_192]
at org.apache.spark.storage.DiskBlockObjectWriter.initialize(DiskBlockObjectWriter.scala:140) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:159) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:306) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:171) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.13-3.3.0.jar:3.3.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_192]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_192]
at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_192]
[ERROR] 2023-10-04 16:55:02.449 [ 140] - Task 7 in stage 15.0 failed 1 times; aborting job
[ERROR] 2023-10-04 16:55:02.506 [ 116] - Job aborted due to stage failure: Task 7 in stage 15.0 failed 1 times, most recent failure: Lost task 7.0 in stage 15.0 (TID 116) (south executor driver): java.io.FileNotFoundException: /tmp/blockmgr-e08af927-6eba-4f73-9857-5811f088c13e/25/temp_shuffle_8e7e78ba-40b4-4e14-882f-b610605b9529 (Too many open files)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at org.apache.spark.storage.DiskBlockObjectWriter.initialize(DiskBlockObjectWriter.scala:140)
at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:159)
at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:306)
at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:171)
at org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52)
at org.apache.spark.scheduler.Task.run(Task.scala:136)
at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548)
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

에러 발생 원인에 대한 힌트는 Too many open files라는 에러문구에서 알 수 있는데요.
작업 실행 중 너무 많은 파일을 열어 생기는 오류입니다.
 
해결을 위해서 Linux 의 ulimit 값을 확인해 보겠습니다.
ulimit 은 user limit의 줄임말로 사용자 실행 프로세스의 자원을 제한하는 설정입니다.

유저명에 담당중인 제품 이름이 들어가있어 살짝 가렸어요ㅎㅎ

 
open files의 값이 1024로 설정되어 있는 것을 확인할 수 있습니다.
ulimit -n 명령어로도 확인이 가능합니다.
open files 항목은 한 프로세스에서 열 수 있는 최대 파일 수를 뜻합니다.
 
값 변경을 위해 아래 명령어를 입력해보겠습니다.

// open files 값 변경 
ulimit -n 설정값

저는 524288로 설정했습니다.
 

ulimit -n 명령어로 확인 결과 설정값이 변경된 것을 확인할 수 있습니다.
다만 해당 명령어로 설정한 값은 세션 종료 시 초기화되니 영구적으로 변경하시고 싶으시다면 RHEL 기준 /etc/security/limits.conf 파일을 수정하셔야 합니다. 
아래와 같이 추가하시면 됩니다.

// /etc/security/limits.conf file 
spark      -    nofile    64000
728x90