這里,我們省略hadoop源碼導入eclipse的過程。
在上一篇我們尋找main()函數的文章,我們可以看到,腳本文件啟動hdfs的過程分兩步,見下圖:
先啟動namenode, 再啟動datanodes。注意,在注釋中指出的,如果先啟動datanode,datanode就會向log中寫入連接錯誤直到namenodes被啟動。這說明,datanode和namenode之間存在通信聯系。這里就有通信方面的源碼實現可以研究。我們暫且先不看這一塊。
當然,這是腳本的啟動過程。我們需要在hadoop的源碼中啟動,但是要按照先啟動namenode后啟動datanode的順序。
在hadoop源碼的工程目錄下(Hadoop部分核心源碼已經被導入eclipse),找到org/apache/hadoop/hdfs/server/namenode/NameNode.java文件,并運行run configurations。第一次運行需要-format參數,之后,就不需要其它參數,直接運行即可。
接著運行datanode,目錄org/apache/hadoop/hdfs/server/datanode/DataNode.java。正常來說,不需要其它參數,直接運行即可。但是,我在運行過程中遇到了一個錯誤:
WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /Users/wuyi/Downloads/hadoop-1.2.1/tmp/dfs, expected: rwxr-xr-x, while actual: rwxrwxrwx
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid.
我的錯誤記錄忘記截圖了,這個是我在網上找的,一模一樣的。大概意思就是說,文件權限不對。
然后,我就根據調用的層次,又開始順藤摸瓜,把hadoop默認的文件權限改成了777。
發現還是有問題。。。然后繼續順藤摸瓜,(從DataNode.java)直到DataStorage.java中下面這個地方:
我把startOpt(估計是datanode啟動方式)改成FORMAT,datanode就奇跡般的可以正常啟動了。然后,我又改回原來的REGULAR,datanode也可以正常啟動了。至于原因,我在截圖里做了猜測(datanode第一次啟動可能也需要format)。這時候,再把默認權限改成755,也沒有問題了。
至此hdfs就成功啟動了。
為了驗證hdfs已經成功啟動,我們在hdfs的根目錄下創建一個test目錄。從上一篇文章中,我們知道,在命令行里fs的操作都從rg.apache.hadoop.fs.FsShell這個入口進。我們在eclipse中找到這個入口,然后在run configurations里給參數 -mkidr /test。
然后我們再用-ls /檢驗,運行帶參數-ls /的FsShell:
然后,我們在控制臺上可以看到:
由此,我們得到了驗證。