記錄一下,可能算是個比較典型的故障,磁碟滿導致的task tracker無法啟動。

故障是一臺tasktracker掛了,怎麼也起不來,報錯資訊如下。

 

  1. 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 
  2.         at org.apache.hadoop.io.nativeio.NativeIO.chmod(Native Method) 
  3.         at org.apache.hadoop.fs.FileUtil.execSetPermission(FileUtil.java:699) 
  4.         at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:654) 
  5.         at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:509) 
  6.         at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:344) 
  7.         at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:189) 
  8.         at org.apache.hadoop.mapred.TaskTracker.initialize(TaskTracker.java:723) 
  9.         at org.apache.hadoop.mapred.TaskTracker.<init>(TaskTracker.java:1459) 
  10.         at org.apache.hadoop.mapred.TaskTracker.main(TaskTracker.java:3742) 
  11.  
  12. 2013-03-26 17:34:57,621 INFO org.apache.hadoop.mapred.TaskTracker: SHUTDOWN_MSG:  
  13. /************************************************************ 
  14. SHUTDOWN_MSG: Shutting down TaskTracker at hadoop-node-51/192.168.1.51 
  15. ************************************************************/ 

從表面上看,這是一個找不到檔案的錯誤,下面還報了一堆跟建立目錄和許可權設定相關的錯誤。然後翻看了相關的原始碼,發現跟這些都沒關係。

上google搜了一圈也沒有什麼斬獲,都是與此無關的報錯。

按照報錯是許可權設定的問題進行分析,以為是有人不小心改了mapred資料夾下的檔案的許可權,導致hadoop無法建立資料夾和讀取檔案造成的。於是去mapred資料夾檢視,發現許可權都是正確的。但是還是強行chown了一遍,但是沒起作用。tt仍然起不來。

後來看了一下df,發現幾塊硬碟中的一塊100%了,完全一點空間都不剩。進去看了一下,是因為有人在跑任務的時候,把map/reduce中間結果的臨時資料檔案扔到了那塊硬碟裡,也沒有及時清理,所以導致磁碟滿了。

讓相關人員清理了中間檔案,task tracker立刻就正常啟動。

 

這個報錯是比較神奇的,按說跟磁碟相關的事情,hadoop起碼應該報一個DiskChecker的故障,但是卻報了一個找不到檔案的故障。一方面說明hadoop的有些報錯呼叫的exception並不完全準確,在設定了dfs保留分割槽的情況下,硬碟滿了,報錯是跟硬碟無關的反而報了許可權錯誤。一方面也說明運維hadoop的人需要拓寬思路,有時候一件事表象,不代表這件事背後的原因就是這樣的,一定要去找到那個truth。