記錄一下,可能算是個比較典型的故障,磁碟滿導致的task tracker無法啟動。
故障是一臺tasktracker掛了,怎麼也起不來,報錯資訊如下。
- 2013-03-26 17:34:57,620 ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because ENOENT: No such file or directory
- at org.apache.hadoop.io.nativeio.NativeIO.chmod(Native Method)
- at org.apache.hadoop.fs.FileUtil.execSetPermission(FileUtil.java:699)
- at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:654)
- at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:509)
- at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:344)
- at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:189)
- at org.apache.hadoop.mapred.TaskTracker.initialize(TaskTracker.java:723)
- at org.apache.hadoop.mapred.TaskTracker.<init>(TaskTracker.java:1459)
- at org.apache.hadoop.mapred.TaskTracker.main(TaskTracker.java:3742)
- 2013-03-26 17:34:57,621 INFO org.apache.hadoop.mapred.TaskTracker: SHUTDOWN_MSG:
- /************************************************************
- SHUTDOWN_MSG: Shutting down TaskTracker at hadoop-node-51/192.168.1.51
- ************************************************************/
從表面上看,這是一個找不到檔案的錯誤,下面還報了一堆跟建立目錄和許可權設定相關的錯誤。然後翻看了相關的原始碼,發現跟這些都沒關係。
上google搜了一圈也沒有什麼斬獲,都是與此無關的報錯。
按照報錯是許可權設定的問題進行分析,以為是有人不小心改了mapred資料夾下的檔案的許可權,導致hadoop無法建立資料夾和讀取檔案造成的。於是去mapred資料夾檢視,發現許可權都是正確的。但是還是強行chown了一遍,但是沒起作用。tt仍然起不來。
後來看了一下df,發現幾塊硬碟中的一塊100%了,完全一點空間都不剩。進去看了一下,是因為有人在跑任務的時候,把map/reduce中間結果的臨時資料檔案扔到了那塊硬碟裡,也沒有及時清理,所以導致磁碟滿了。
讓相關人員清理了中間檔案,task tracker立刻就正常啟動。
這個報錯是比較神奇的,按說跟磁碟相關的事情,hadoop起碼應該報一個DiskChecker的故障,但是卻報了一個找不到檔案的故障。一方面說明hadoop的有些報錯呼叫的exception並不完全準確,在設定了dfs保留分割槽的情況下,硬碟滿了,報錯是跟硬碟無關的反而報了許可權錯誤。一方面也說明運維hadoop的人需要拓寬思路,有時候一件事表象,不代表這件事背後的原因就是這樣的,一定要去找到那個truth。