啟動hdfs時,有時候可能會遇到這樣幾種情況:
1)在主節點上執行start-dfs.sh命令啟動hdfs,無法啟動datanode。
2)在主節點上行啟動hdfs,啟動成功了,在各個節點上使用jps命令也能查詢到相應的SecondaryNameNode、NameNode和DataNode進程,但是通過5007頁面上卻查詢不到datanode,或者執行hdfs dfsadmin -report(hadoop dfsadmin -report)命令是顯示available datanode個數為0;
一、第一種情況
我沒遇到過這種情況,不過我感覺第一步應該是先去看namenode的日志(日志在namenode節點的$HADOOP_HOME/logs目錄下),另外也可以從以下幾個方面排查問題:
1)看一下slaves文件有沒有配置正確
2)檢查從namenode節點到datanode節點的免密登錄是否配置正確;
3)測試一下從namenode上能否ping通datanode,datanode節點的防火牆有沒有關(或者如果你的本意就是不關閉防火牆,而是只給hadoop開啟特定的端口的話,那就使用telnet命令檢查一下從namenode節點到datanode節點的特定端口能不能連接上)
4)還有一種比較特殊的情況,就是你的namenode和datanode節點上,用於安裝hadoop環境的用戶不一樣,比如在namenode節點上用u1用戶安裝hadoop環境,而在datanode節點上則是用u2用戶安裝的hadoop環境。這種時候就會有問題,因為當你在namenode上啟動hdfs時,肯定是用u1用戶執行的命令(因為你是用u1用戶安裝的hadoop嘛,環境變量是配在這個用戶下的),那么當namenode節點要遠程登錄到datanode節點上去啟動datanode時,namenode默認是會使用當前用戶也就是u1用戶去登錄datanode節點的,這個時候就會出錯,因為datanode節點上沒有u1用戶,根本無法登錄上datanode,更別說去啟動datanode了。對於這個問題,我在網上偶然看到有人的解決方法是在配置masters和slaves時,不單單是寫IP(比如192.168.137.22),而是要寫上用戶名,比如“u2@192.168.137.22”。正如我所說的,這是個比較特殊的問題,最好還是將hadoop集群的所有節點的安裝用戶保持一致。另外我感覺如果集群中的不同節點是用不同用戶來安裝hadoop環境的話,根本無法安裝成功,雖然我在網上看到有朋友說他這么安裝也成功了……我覺得無法安裝成功是因為,這么來安裝hadoop集群環境的話,首先namenode節點到datanode節點的免密登錄就沒法配置,因為在namenode節點上是以u1用戶生成的公鑰,因此在namenode節點上無法以u2用戶的身份免密登錄datanode節點——額…至少以我目前了解的ssh免密登錄設置的知識來說是不行的…………
二、第二種情況
就我遇到錯誤,下面記錄一下,錯誤從datanode的日志中可以查看到(日志在datanode節點的$HADOOP_HOME/logs目錄下)
1)INFO org.apache.hadoop.ipc.RPC: Server at node1/192.168.137.21:9000 not available yet, Zzzzz...
目前我在hadoop1.2.1版本中遇到過這個問題,在hadoop二點幾版本中暫時沒遇到過。該問題的解決可參考《org.apache.hadoop.ipc.Client: Retrying connect to server異常的解決》,不過我的解決方法跟這篇博文有些許不一樣,我只將hdfs主節點的/etc/hosts文件中的“127.0.0.1 主節點主機名”這一行給注釋掉(如下圖),然后重啟hdfs集群就可以了,不需要每個節點都做修改,並且我也沒有重新格式化hdfs。因為我感覺從datanode日志上可以看出,是datanode去連接namenode節點時出現了問題,datanode節點去解析namenode的hosts文件時解析不正確了,所以才導致問題的發生,跟datanode節點的hosts文件應該是沒有關系的。並且不用重新格式化是因為我感覺……不知道怎么說,總之感覺還是……沒關系…………
2)java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/tmp/dfs/data: namenode clusterID = CID-8e201022-6faa-440a-b61c-290e4ccfb006; datanode clusterID = clustername
這個問題我遇到的時候沒有留下截圖,后面由於其他原因導致集群啟動不成功之后上網找解決方法時恰好看到有人貼出來了,所以也記錄一下。
出現該問題是因為hdfs格式化次數太多了出了問題,導致子節點的cluster_id跟主節點的cluster_id不一致,所以導致子節點無法向主節點發送心跳信息,那么對主節點來說,該子節點就是dead的了。
這個問題的解決方法參考《Hadoop安裝遇到的各種異常及解決辦法》中的第二點異常。
3)這也是個沒有保留出錯日志信息的問題。出錯是因為我的子節點的core-site.xml文件中fs.defaultFS項配置錯了。
所以如果遇到了“datanode節點啟動成功,但是namenode節點卻檢測不到該datanode”的情況時,可以檢查一下此項配置,因為core-site.xml文件中的fs.defaultFS項配置就是記錄集群中namenode節點的位置,如果配置錯了,datanode就無法向正確的namenode節點發送心跳信息,namenode自然感知不到該datanode的存在了。
暫時記錄這么多了……