Spark - ERROR Executor: java.lang.OutOfMemoryError: unable to create new native thread

41485 단어 spark
Spark 프로그램을 실행하는 동안 다음과 같은 오류가 발생했습니다.
ERROR Executor: Exception in task xxx in stage xxx
java.lang.OutOfMemoryError: unable to create new native thread

그러면 가능성이 매우 큰 이유는 현재 spark-submit이나spark-sql을 통해 시작된 프로그램에서 너무 많은 프로세스를 열어 현재 사용자가 열 수 있는 프로세스 수의 상한선을 초과했기 때문이다.이 문제를 확인하는 방법은 다음과 같습니다.
먼저 명령을 통해 다음을 수행합니다.
ulimit -u

1
시스템이 허용하는 현재 사용자가 열 수 있는 프로세스 수를 보십시오. 기본값은 1024입니다.
그리고 우리는 다음과 같은 명령을 통해 현재 사용자가 열고 있는 프로세스 수를 지속적으로 추적한다
while true;do ps -u your-user-name  -L | wc -l;sleep 1;done

1
이어서 시작할 수 있는 우리 스파크 프로그램을 살펴보고 프로세스 수량의 변화를 관찰합니다. 프로세스 수량이 지속적으로 증가하고 프로세스 상한선을 초과한 후에 OOM 이상을 던지면 사용자가 열 수 있는 프로세스 수량의 제한을 직접 판정할 수 있습니다.
그렇다면 어떤 경우spark가 실행 과정에서 대량의 프로세스를 시작하게 될까요?가능한 원인은 데이터의 무질서성 때문에 shuffle 프로세스의 비용이 너무 많이 든다는 것이다.
JVM 수준에서 해결
thread stack 크기 줄이기
JVM 기본 thread stack 크기는 1024로 스레드가 많을 때 Native virtual memory가 소진되고 실제 thread stack 크기가 128K 또는 256K일 때 충분하므로 thread stack을 128K 또는 256K로 명시하면 됩니다-Xss, JVM JVM_OPT .
[java]  view plain  copy
  1. -Xss128k  

heap permgen

JVM JVM_OPT

[java]  view plain  copy
  1. -Xms1303m -Xmx1303m -XX:PermSize=256m -XX:MaxPermSize=256m  

[java]  view plain  copy
  1. -Xms256m -Xmx1303m -XX:PermSize=64m -XX:MaxPermSize=256m  

[java]  view plain  copy
  1. -Xmx1303m -XX:MaxPermSize=256m  

JVM
최신 버전의 JVM은 일반적으로 메모리 최적화 방면에서 더욱 잘하는데, JVM을 최신 버전으로 업그레이드하면 측정 문제를 완화시킬 수 있다 64 32 unable to create new native thread, 64
스레드에 대한 OS 제한 확대
Linux 운영체제에서 nofile와 nproc를 설정하고 구체적으로 편집/etc/security/limits.conf :
[html]  view plain  copy
  1. soft    nofile          2048  
  2. hard    nofile          8192  

[html]  view plain  copy
  1. soft    nproc           2048  
  2. hard    nproc           8192  

Red Hat Enterprise Linux 6, /etc/security/limits.d/90-nproc.conf, :
[html]  view plain  copy
  1. # cat /etc/security/limits.d/90-nproc.conf  
  2. *          soft    nproc     1024  
  3. root       soft    nproc     unlimited  
  4.   
  5. user       -       nproc     2048  

   

 ( , ):32 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,

Java    
  1. import java.util.concurrent.CountDownLatch;   
  2.   
  3. public class TestNativeOutOfMemoryError {   
  4.   
  5.     public static void main(String[] args) {   
  6.   
  7.         for (int i = 0;; i++) {   
  8.             System.out.println("i = " + i);   
  9.             new Thread(new HoldThread()).start();   
  10.         }   
  11.     }   
  12.   
  13. }   
  14.   
  15. class HoldThread extends Thread {   
  16.     CountDownLatch cdl = new CountDownLatch(1);   
  17.   
  18.     public HoldThread() {   
  19.         this.setDaemon(true);   
  20.     }   
  21.   
  22.     public void run() {   
  23.         try {   
  24.             cdl.await();   
  25.         } catch (InterruptedException e) {   
  26.         }   
  27.     }   
  28. }  
[java]  view plain  copy
  1. import java.util.concurrent.CountDownLatch;  
  2.   
  3. public class TestNativeOutOfMemoryError {  
  4.   
  5.     public static void main(String[] args) {  
  6.   
  7.         for (int i = 0;; i++) {  
  8.             System.out.println("i = " + i);  
  9.             new Thread(new HoldThread()).start();  
  10.         }  
  11.     }  
  12.   
  13. }  
  14.   
  15. class HoldThread extends Thread {  
  16.     CountDownLatch cdl = new CountDownLatch(1);  
  17.   
  18.     public HoldThread() {  
  19.         this.setDaemon(true);  
  20.     }  
  21.   
  22.     public void run() {  
  23.         try {  
  24.             cdl.await();  
  25.         } catch (InterruptedException e) {  
  26.         }  
  27.     }  
  28. }  
 

 

JVM ,eclipse , :
i = 5602
 
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:597)
    at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)

 

、 :

, , 。 : 
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 
MaxProcessMemory
JVMMemory         JVM
ReservedOsMemory 
ThreadStackSize     

java , , JVM Thread , JVMMemory, (MaxProcessMemory - JVMMemory - ReservedOsMemory)。 


 
MaxProcessMemory 32 windows 2G
JVMMemory   eclipse 64M
ReservedOsMemory  130M
ThreadStackSize 32 JDK 1.6 stacksize 325K

(2*1024*1024-64*1024-130*1024)/325 = 5841 
5841, 5602 ( ReservedOsMemory )
 

JVM , , java.lang.OutOfMemoryError: unable to create new native thread。 

, , , , , JVM , :
 
ThreadStackSize      JVMMemory                   
325K             -Xms1024m -Xmx1024m    i = 2655
325K               -Xms1224m -Xmx1224m    i = 2072
325K             -Xms1324m -Xmx1324m    i = 1753
325K             -Xms1424m -Xmx1424m    i = 1435
-Xss1024k             -Xms1424m -Xmx1424m    i = 452
 
 

、 : 
1, bug, , bug, 。
2, , , MaxProcessMemory,JVMMemory,ThreadStackSize , :
a, MaxProcessMemory 64
b, JVMMemory   JVMMemory
c, ThreadStackSize 


좋은 웹페이지 즐겨찾기