由於最近叢集xcievers錯誤頻頻發生,已經到了影響叢集正常運營的地步,於是決定修改叢集所有的datanode節點的配置,並重啟datanode,欲添加的配置項如下:
<property> <name>dfs.datanode.max.xcievers</name> <value>256</value> </property>
修改完設定檔後,在重啟datanode時發生了麻煩,datanode開機記錄報出了版本不一致錯誤,詳細日誌如下:
2012-07-10 16:39:14,991 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG: /************************************************************STARTUP_MSG: Starting DataNodeSTARTUP_MSG: host = STARTUP_MSG: args = []STARTUP_MSG: version = 0.20.203.0STARTUP_MSG: build = http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203 -r 1099333; compiled by 'oom' on Wed May 4 07:57:50 PDT 2011************************************************************/2012-07-10 16:39:15,244 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties2012-07-10 16:39:15,268 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.2012-07-10 16:39:15,270 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).2012-07-10 16:39:15,270 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: DataNode metrics system started2012-07-10 16:39:15,412 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.2012-07-10 16:39:15,557 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Incompatible build versions: namenode BV = ; datanode BV = 10993332012-07-10 16:39:15,662 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible build versions: namenode BV = ; datanode BV = 1099333 at org.apache.hadoop.hdfs.server.datanode.DataNode.handshake(DataNode.java:528) at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:331) at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:268) at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1480) at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1419) at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1437) at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1563) at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1573)2012-07-10 16:39:15,663 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:
datanode在擷取namenode版本時出錯,無法擷取到namenode的版本。
分別嘗試了一下解決辦法:
1)重新安裝hadoop,失敗
2)對比hadoop datanode檔案儲存體目錄中的storage檔案,對比其中的namespace id和storage id,沒有發現異常,失敗
3)修改hdfs-site.xml配置,將資料存放區目錄修改為建立檔案夾,啟動datanode,失敗
4)查看namenode的開機記錄,發現namenode最後一次啟動時,版本升級為:0.20.203.1-snapshot,⊙﹏⊙b汗
看來是前段時間做hadoop叢集維護時重啟了namenode,且有人自行編譯了hadoop源碼,產生了hadoop 目錄下build檔案夾下面產生了新的hadoop版本,hadoop啟動時會預設優先選擇build目錄下的版本,可能由於203.1版本相對203.0版本改動較小,所以在namenode啟動後一直正常運行,整個hadoop叢集也沒有發生異常,一直到重啟datanode時,datanode 的hadoop版本是203.0和namenode版本不一致,啟動失敗。
找到了問題的根源,解決辦法也就相應出來了:
1)降級namenode,缺點:需要停止服務,不確定性因素太多(降級可能會導致所有資料丟失),測試周期長且複雜;優點:只要操作一個節點
2)升級所有的datanode,缺點:需要操作叢集所有機器(也可以只升級單台機器);優點:測試簡單,風險小
很明顯,第二種方案是優選方案,測試過程如下:
1)找一台採集伺服器,上面已經部署了hadoop用戶端,啟動datanode,成功,日誌資訊顯示版本為:203.1
2)刪除build目錄,再次啟動datanode,失敗
3)恢複build目錄,再次啟動datanode,成功
4)將build目錄拷貝到出錯的datanode上,修改hdfs-site.xml配置,將data目錄修改為建立目錄,啟動datanode,成功
5)將data目錄修改為最原始的配置,啟動datanode,成功
第二種方案測試成功,在namenode上運行fsck命令,正常輸出。
於是升級整個叢集,到目前為止,叢集運行正常。