IT Share you

Hadoop의 메모리 부족 오류

shareyou 2020. 12. 6. 22:21
반응형

Hadoop의 메모리 부족 오류


http://hadoop.apache.org/common/docs/stable/single_node_setup.html 문서에 따라 Hadoop 설치를 시도했습니다 . 내가 이것을 실행하려고 할 때

bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 

다음과 같은 예외가 발생합니다.

java.lang.OutOfMemoryError: Java heap space

예제를 시도해 볼 수 있도록 솔루션을 제안하십시오. 전체 예외는 다음과 같습니다. 나는 Hadoop을 처음 사용하는데 멍청한 일을했을 수도 있습니다. 어떤 제안이라도 대단히 감사하겠습니다.

anuj@anuj-VPCEA13EN:~/hadoop$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
11/12/11 17:38:22 INFO util.NativeCodeLoader: Loaded the native-hadoop library
11/12/11 17:38:22 INFO mapred.FileInputFormat: Total input paths to process : 7
11/12/11 17:38:22 INFO mapred.JobClient: Running job: job_local_0001
11/12/11 17:38:22 INFO util.ProcessTree: setsid exited with exit code 0
11/12/11 17:38:22 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@e49dcd
11/12/11 17:38:22 INFO mapred.MapTask: numReduceTasks: 1
11/12/11 17:38:22 INFO mapred.MapTask: io.sort.mb = 100
11/12/11 17:38:22 WARN mapred.LocalJobRunner: job_local_0001
java.lang.OutOfMemoryError: Java heap space
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:949)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:428)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
11/12/11 17:38:23 INFO mapred.JobClient:  map 0% reduce 0%
11/12/11 17:38:23 INFO mapred.JobClient: Job complete: job_local_0001
11/12/11 17:38:23 INFO mapred.JobClient: Counters: 0
11/12/11 17:38:23 INFO mapred.JobClient: Job Failed: NA
java.io.IOException: Job failed!
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1257)
    at org.apache.hadoop.examples.Grep.run(Grep.java:69)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.hadoop.examples.Grep.main(Grep.java:93)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
    at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:139)
    at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:64)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:156)

conf / mapred-site.xml 파일을 편집하고 속성을 추가하여 더 많은 메모리를 할당 할 수 있습니다.

  <property>
    <name>mapred.child.java.opts</name>
    <value>-Xmx1024m</value>
  </property>

이렇게하면 더 많은 힙 공간이있는 Hadoop JVM이 시작됩니다.


RPM 또는 DEB 패키지를 사용하는 사람에게는 문서와 일반적인 조언이 잘못된 것입니다. 이 패키지는 / etc / hadoop에 hadoop 구성 파일을 설치합니다. 다른 설정보다 우선합니다.

/etc/hadoop/hadoop-env.sh는 Hadoop의 최대 Java 힙 메모리를 설정하며 기본적으로 다음과 같습니다.

   export HADOOP_CLIENT_OPTS = "-Xmx128m $ HADOOP_CLIENT_OPTS"

이 Xmx 설정이 너무 낮습니다. 간단히 변경하고 다시 실행하십시오.

   export HADOOP_CLIENT_OPTS = " -Xmx2048m $ HADOOP_CLIENT_OPTS"

또 다른 가능성은 편집되어 hadoop-env.sh포함되어있는 export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS". 제 경우에는 128m를 1024m로 변경하는 것이 도움이되었습니다 (Debian의 Hadoop 1.0.0.1).


많은 조합을 시도한 후 마침내 내 환경 (Ubuntu 12.04, Hadoop 1.0.4)에서 동일한 오류가 두 가지 문제로 인해 발생한다는 결론을 내 렸습니다.

  1. 위에서 언급 한 Zach Gamer와 동일합니다.
  2. 먼저 "ssh localhost"를 실행하는 것을 잊지 마십시오. 믿거 나 말거나! ssh는 Java 힙 공간에서도 오류 메시지를 표시하지 않습니다.

mapreduce.{map|reduce}.java.opts및을 (를) 조정해야 합니다 mapreduce.{map|reduce}.memory.mb.

예를 들면 :

  hadoop jar <jarName> <fqcn> \
      -Dmapreduce.map.memory.mb=4096 \
      -Dmapreduce.map.java.opts=-Xmx3686m

여기 이 질문에 대한 대답은 좋은 자원이다


파일을 편집하여이 문제를 해결할 수 있습니다 /etc/hadoop/hadoop-env.sh.

Hadoop은 conf 디렉토리보다 / etc / hadoop config 디렉토리에 우선 순위를 부여했습니다.

나도 같은 상황을 만났다.


다음과 같이 작업을 실행하십시오.

bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.java.opts=-Xmx1024M input output 'dfs[a-z.]+' 

기본적으로 힙 공간은 32MB 또는 64MB로 설정됩니다. Tudor가 지적한대로 특성 파일의 힙 공간을 늘리거나이 특정 작업에 대해이 특성을 설정하여이 특정 작업에 대해이를 변경할 수 있습니다.


바이너리 tar에서 hadoop 1.0.4를 설치했고 메모리 부족 문제가있었습니다. 나는 Tudor 's, Zach Garner 's, Nishant Nagwani 's 및 Andris Birkmanis의 솔루션을 시도했지만 그들 중 어느 것도 나를 위해 일하지 않았습니다.

Editing the bin/hadoop to ignore $HADOOP_CLIENT_OPTS worked for me:

...
elif [ "$COMMAND" = "jar" ] ; then
     CLASS=org.apache.hadoop.util.RunJar
    #Line changed this line to avoid out of memory error:
    #HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
    # changed to:
     HADOOP_OPTS="$HADOOP_OPTS "
...

I'm assuming that there is a better way to do this but I could not find it.


The same exception with Ubuntu, Hadoop 1.1.1. The solution was simple - edit shell variable $HADOOP_CLIENT_OPTS set by some init script. But it took long time to find it =(


We faced the same situation.

Modifying the hadoop-env.sh worked out for me.

EXPORT HADOOP_HEAPSIZE would be commented, uncomment that & provide the size of your choice.

By default HEAPSIZE assigned is 1000MB.


Configure the JVM heap size for your map and reduce processes. These sizes need to be less than the physical memory you configured in the previous section. As a general rule, they should be 80% the size of the YARN physical memory settings.

Configure mapreduce.map.java.opts and mapreduce.reduce.java.opts to set the map and reduce heap sizes respectively, e.g.

<property>  
   <name>mapreduce.map.java.opts</name>  
   <value>-Xmx1638m</value>
</property>
<property>  
   <name>mapreduce.reduce.java.opts</name>  
   <value>-Xmx3278m</value>
</property>

Exporting the variables by running the following command worked for me:

. conf/hadoop-env.sh

On Ubuntu using DEB install (at least for Hadoop 1.2.1) there is a /etc/profile.d/hadoop-env.sh symlink created to /etc/hadoop/hadoop-env.sh which causes it to load every time you log in. In my experience this is not necessary as the /usr/bin/hadoop wrapper itself will eventually call it (through /usr/libexec/hadoop-config.sh). On my system I've removed the symlink and I no longer get weird issues when changing the value for -Xmx in HADOOP_CLIENT_OPTIONS (because every time that hadoop-env.sh script is run, the client options environment variable is updated, though keeping the old value)


I ended up with a very similar issue last week. My input file that I was using had a big ass line in it which I could not view. That line was almost 95% of my file size(95% of 1gb! imagine that!). I would suggest you take a look at your input files first. You might be having a malformed input file that you want to look into. Try increasing heap space after you check the input file.


Make sure the mapreduce.child.java.opts have sufficient memory required to run mapred job. Also ensure that mapreduce.task.io.sort.mb should be less than mapreduce.child.java.opts.

Example:

 mapreduce.child.java.opts=Xmx2048m

 mapreduce.task.io.sort.mb=100

Otherwise you'll hit the OOM issue even the HADOOP_CLIENT_OPTS in hadoop-env.sh have enough memory if configured.

참고URL : https://stackoverflow.com/questions/8464048/out-of-memory-error-in-hadoop

반응형