Spark - ERROR Executor: java.lang.OutOfMemoryError: unable to create new native thread
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
.
- -Xss128k
heap permgen
JVM JVM_OPT
- -Xms1303m -Xmx1303m -XX:PermSize=256m -XX:MaxPermSize=256m
,
- -Xms256m -Xmx1303m -XX:PermSize=64m -XX:MaxPermSize=256m
- -Xmx1303m -XX:MaxPermSize=256m
JVM
최신 버전의 JVM은 일반적으로 메모리 최적화 방면에서 더욱 잘하는데, JVM을 최신 버전으로 업그레이드하면 측정 문제를 완화시킬 수 있다
64
32 unable to create new native thread, 64
스레드에 대한 OS 제한 확대
Linux 운영체제에서 nofile와 nproc를 설정하고 구체적으로 편집/etc/security/limits.conf :
- soft nofile 2048
- hard nofile 8192
- soft nproc 2048
- hard nproc 8192
Red Hat Enterprise Linux 6, /etc/security/limits.d/90-nproc.conf, :
- # cat /etc/security/limits.d/90-nproc.conf
- * soft nproc 1024
- root soft nproc unlimited
-
- user - nproc 2048
-
:
( , ):32 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4,
:
- import java.util.concurrent.CountDownLatch;
-
- public class TestNativeOutOfMemoryError {
-
- public static void main(String[] args) {
-
- for (int i = 0;; i++) {
- System.out.println("i = " + i);
- new Thread(new HoldThread()).start();
- }
- }
-
- }
-
- class HoldThread extends Thread {
- CountDownLatch cdl = new CountDownLatch(1);
-
- public HoldThread() {
- this.setDaemon(true);
- }
-
- public void run() {
- try {
- cdl.await();
- } catch (InterruptedException e) {
- }
- }
- }
- import java.util.concurrent.CountDownLatch;
-
- public class TestNativeOutOfMemoryError {
-
- public static void main(String[] args) {
-
- for (int i = 0;; i++) {
- System.out.println("i = " + i);
- new Thread(new HoldThread()).start();
- }
- }
-
- }
-
- class HoldThread extends Thread {
- CountDownLatch cdl = new CountDownLatch(1);
-
- public HoldThread() {
- this.setDaemon(true);
- }
-
- public void run() {
- try {
- cdl.await();
- } catch (InterruptedException e) {
- }
- }
- }
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spark 팁: 컴퓨팅 집약적인 작업을 위해 병합 후 셔플 파티션 비활성화작은 입력에서 UDAF(사용자 정의 집계 함수) 내에서 컴퓨팅 집약적인 작업을 수행할 때 spark.sql.adaptive.coalescePartitions.enabled를 false로 설정합니다. Apache Sp...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.