2013-03-19 148 views
5

我運行的hive查詢運行良好的小數據集。但我運行了250萬條記錄,我在日誌中獲得了以下錯誤java.lang.OutOfMemoryError:無法爲大數據集創建新的本地線程

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) 

需要幫助。

+0

我在運行任務(map或reduce)的任務跟蹤器節點上沒有剩餘磁盤空間之前就已經看到了這一點。你的集羣有多大,每個集羣節點上的可用空間是多少(在映射存儲它的臨時文件的分區上) – 2013-03-19 10:46:40

回答

-1

謝謝大家..你是對的。這是因爲文件描述符,因爲我的程序在目標表中生成了很多文件。由於分區結構的多層次。

我增加了ulimit和xceivers屬性。它確實有幫助。但仍然在我們的情況下,這些限制也被越過了

然後我們決定按照分區分配數據,然後我們只得到每個分區一個文件。

它爲我們工作。我們將系統的規模擴大到500億條記錄,並且它對我們有效

+0

嗨我在'hive.log'中得到這個錯誤,作爲許多異常的子例外。設置'ulimit'後,我們是否需要重啓運行hiveserver和/或metastore的機器? – Mahesha999 2015-07-30 14:51:27

+0

這更像是一個評論,而不是一個真正的答案。 – raindev 2016-06-06 08:22:21

1

如果您的作業由於節點上的OutOfMemmory而失敗,那麼您可以針對每個節點調整最大映射和縮減器的數量以及JVM選項。 mapred.child.java.opts(默認爲200Xmx)通常必須根據您的數據節點特定的硬件增加。

7

我已經在一般情況下使用過MapReduce。根據我的經驗,它實際上並不是內存不足錯誤 - 系統沒有足夠的文件描述符來啓動線程,這就是爲什麼它說「無法創建新的本地線程」。

對我們來說(在Linux上)的修復是通過:ulimit -n 2048將ulimit(設置爲1024)增加到2048。您需要擁有執行此操作的權限 - sudo或root訪問權限,或者具有2048或更高的硬性限制,因此您可以將其設置爲系統上自己的用戶。您可以在您的.profile.bashrc設置文件中執行此操作。

您可以使用ulimit -a檢查當前設置。有關更多詳細信息,請參閱此參考:https://stackoverflow.com/a/34645/871012

我也見過很多其他人討論更改/etc/security/limits.conf文件,但我還沒有這樣做。這裏是一個鏈接,談論它:https://stackoverflow.com/a/8285278/871012

相關問題