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