2013-03-19 9 views
5

Ho una query hive in esecuzione che funziona bene per un piccolo set di dati. ma sto correndo per 250 milioni di record che ho sotto errori nei registrijava.lang.OutOfMemoryError: impossibile creare un nuovo thread nativo per il big data set

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) 

bisogno di aiuto su questo.

+0

Ho già visto questo in cui non è rimasto più spazio sul nodo del tracker attività che esegue l'attività (mappa o riduzione). Quanto è grande il tuo cluster e qual è lo spazio libero disponibile su ciascun nodo del cluster (sulla partizione in cui mapred memorizza i file temporanei) –

risposta

-1

Grazie a tutti voi ... avete ragione. è a causa del descrittore di file, poiché il mio programma stava generando molto file nella tabella di destinazione. a causa del multilivello della struttura delle partizioni.

Ho aumentato la proprietà ulimit e anche xceivers. ha aiutato. ma ancora nella nostra situazione anche questi limiti sono stati superati

Quindi abbiamo deciso di distribuire i dati secondo le partizioni e quindi stiamo ottenendo solo un file per partizione.

Ha funzionato per noi. Abbiamo ridimensionato il nostro sistema a 50 + miliardi di record e ha funzionato per noi

+0

Ciao Sto ricevendo questo errore in 'hive.log' come un'eccezione secondaria di molte eccezioni. È necessario riavviare la macchina che esegue hiveerver e/o metastore dopo aver impostato 'ulimit'? – Mahesha999

+0

È più un commento che una vera risposta. – raindev

1

Se il tuo lavoro non funziona a causa di OutOfMemmory sui nodi, puoi verificare il numero massimo di mappe e riduttori e gli opzionali JVM per ciascuno. mapred.child.java.opts (il valore predefinito è 200Xmx) di solito deve essere aumentato in base all'hardware specifico dei tuoi data node.

7

Ho sperimentato questo con MapReduce in generale. Nella mia esperienza, in realtà non è un errore di memoria esaurita - il sistema sta esaurendo i descrittori di file per avviare i thread, motivo per cui si dice "impossibile creare un nuovo thread nativo".

La correzione per noi (su Linux) era di aumentare il limite, che era impostato su 1024, su 2048 tramite: ulimit -n 2048. È necessario disporre delle autorizzazioni per eseguire questa operazione: sudo o accesso root o con un limite rigido di 2048 o superiore in modo da poterlo impostare come utente sul sistema. Puoi farlo nel tuo file di impostazioni .profile o .bashrc.

È possibile verificare le impostazioni correnti con ulimit -a. Vedere questo riferimento per ulteriori dettagli: https://stackoverflow.com/a/34645/871012

Ho visto anche molti altri parlare di modificare il file /etc/security/limits.conf, ma non ho ancora dovuto farlo. Ecco un collegamento che ne parla: https://stackoverflow.com/a/8285278/871012

Problemi correlati