복붙노트

[HADOOP] java.lang.OutOfMemoryError : 큰 데이터 세트에 대해 새 원시 스레드를 만들 수 없습니다.

HADOOP

java.lang.OutOfMemoryError : 큰 데이터 세트에 대해 새 원시 스레드를 만들 수 없습니다.

나는 작은 데이터 집합에 대해 잘 실행되는 하이브 쿼리를 실행하고있다. 하지만 로그에 오류가 발생하는 2 억 5 천만 개의 레코드를 실행 중입니다.

 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError:   unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:640)
    at org.apache.hadoop.mapred.Task$TaskReporter.startCommunicationThread(Task.java:725)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:362)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1136)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)



 2013-03-18 14:12:58,907 WARN org.apache.hadoop.mapred.Child: Error running child
 java.io.IOException: Cannot run program "ln": java.io.IOException: error=11, Resource temporarily unavailable
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:431)
    at java.lang.Runtime.exec(Runtime.java:369)
    at org.apache.hadoop.fs.FileUtil.symLink(FileUtil.java:567)
    at org.apache.hadoop.mapred.TaskRunner.symlink(TaskRunner.java:787)
    at org.apache.hadoop.mapred.TaskRunner.setupWorkDir(TaskRunner.java:752)
    at org.apache.hadoop.mapred.Child.main(Child.java:225)
 Caused by: java.io.IOException: java.io.IOException: error=11, Resource temporarily unavailable
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
    at java.lang.ProcessImpl.start(ProcessImpl.java:65)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
    ... 7 more
2013-03-18 14:12:58,911 INFO org.apache.hadoop.mapred.Task: Runnning cleanup for the task
2013-03-18 14:12:58,911 INFO org.apache.hadoop.mapred.Child: Error cleaning up
  java.lang.NullPointerException
    at org.apache.hadoop.mapred.Task.taskCleanup(Task.java:1048)
    at org.apache.hadoop.mapred.Child.main(Child.java:281)

이것에 대한 도움이 필요합니다.

해결법

  1. ==============================

    1.필자는 일반적으로 MapReduce를 경험했습니다. 내 경험에 따르면 실제로 메모리 부족 오류가 아닙니다. 시스템에서 파일 설명자가 부족하여 스레드를 시작할 수 없으므로 "새 원시 스레드를 만들 수 없습니다"라는 메시지가 표시됩니다.

    필자는 일반적으로 MapReduce를 경험했습니다. 내 경험에 따르면 실제로 메모리 부족 오류가 아닙니다. 시스템에서 파일 설명자가 부족하여 스레드를 시작할 수 없으므로 "새 원시 스레드를 만들 수 없습니다"라는 메시지가 표시됩니다.

    우리 (Linux)의 수정 사항은 1024로 설정된 ulimit를 2048을 통해 ulimit -n 2048으로 늘리는 것이 었습니다. ulimit -n 2048을 사용하려면이 작업을 수행 할 수있는 권한이 있어야합니다 (sudo 또는 root 액세스 또는 하드 제한이 있음). 2048 이상이므로 시스템에서 자신의 사용자로 설정할 수 있습니다. .profile 또는 .bashrc 설정 파일에서이 작업을 수행 할 수 있습니다.

    ulimit -a를 사용하여 현재 설정을 확인할 수 있습니다. 자세한 내용은이 참조 자료를 참조하십시오. https://stackoverflow.com/a/34645/871012

    나는 또한 많은 사람들이 /etc/security/limits.conf 파일을 변경하는 것에 관해 이야기했지만, 아직 그렇게 할 필요가 없었다. 여기에 대한 링크가 있습니다 : https://stackoverflow.com/a/8285278/871012

  2. ==============================

    2.노드의 OutOfMemmory로 인해 작업이 실패한 경우 최대 맵 수와 감속기 수를 트위 킹 할 수 있고 각각에 대한 JVM 옵트 아웃을 수행 할 수 있습니다. mapred.child.java.opts (기본값은 200Xmx)는 일반적으로 데이터 노드의 특정 하드웨어에 따라 증가되어야합니다.

    노드의 OutOfMemmory로 인해 작업이 실패한 경우 최대 맵 수와 감속기 수를 트위 킹 할 수 있고 각각에 대한 JVM 옵트 아웃을 수행 할 수 있습니다. mapred.child.java.opts (기본값은 200Xmx)는 일반적으로 데이터 노드의 특정 하드웨어에 따라 증가되어야합니다.

  3. ==============================

    3.고마워요 .. 당신 말이 맞아요. 그것은 내 프로그램이 목표 테이블에 파일을 많이 생성했기 때문에 파일 설명 자 때문입니다. 파티션 구조의 다단계로 인해.

    고마워요 .. 당신 말이 맞아요. 그것은 내 프로그램이 목표 테이블에 파일을 많이 생성했기 때문에 파일 설명 자 때문입니다. 파티션 구조의 다단계로 인해.

    나는 ulimit과 xceivers 속성을 증가 시켰습니다. 도움이되었습니다. 그러나 우리의 상황에서 여전히 그러한 한계는 또한 넘어 섰다.

    그런 다음 파티션별로 데이터를 배포하기로 결정한 다음 파티션 당 하나의 파일 만 가져옵니다.

    그것은 우리를 위해 일했습니다. 우리는 시스템을 50 억 개의 레코드로 확장했으며 우리를 위해 일했습니다.

  4. from https://stackoverflow.com/questions/15494749/java-lang-outofmemoryerror-unable-to-create-new-native-thread-for-big-data-set by cc-by-sa and MIT license