幫 Hadoop HDFS 調整系統資源限制

|
有時候 Map Reduce 的工作跑一跑,會發現 datanode 突然都陣亡,去看 log 會發現很多 Too many open files 的錯誤:

2008-09-11 20:20:22,836 ERROR org.apache.hadoop.dfs.DataNode: 192.168.1.34:50010:DataXceiver: java.io.IOException: Too many open files
        at sun.nio.ch.EPollArrayWrapper.epollCreate(Native Method)
        at sun.nio.ch.EPollArrayWrapper.<init>(EPollArrayWrapper.java:68)
        at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:52)
        at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:18)
        at sun.nio.ch.Util.getTemporarySelector(Util.java:123)
        at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:92)
        at org.apache.hadoop.dfs.DataNode$DataXceiver.writeBlock(DataNode.java:1150)
        at org.apache.hadoop.dfs.DataNode$DataXceiver.run(DataNode.java:994)
        at java.lang.Thread.run(Thread.java:619)

這個發生的原因是同時間很多 client 要去跟 datanode 要東西,因此消耗太多的 file descriptor,那又因為我在用的 Linux 上面預設單一 process 能開的檔案只有 1,024 個,>
於是就造成了這種結果。

修正的方法是去 /etc/security/limits.conf 加上這行:

* - nofile 8192
讓單一 process 能同時開到 8,192 個檔案。改好後重開 datanode 就可以了。