這里,我們省略hadoop源碼導(dǎo)入eclipse的過(guò)程。
在上一篇我們尋找main()函數(shù)的文章,我們可以看到疾就,腳本文件啟動(dòng)hdfs的過(guò)程分兩步,見(jiàn)下圖:
先啟動(dòng)namenode艺蝴, 再啟動(dòng)datanodes猬腰。注意,在注釋中指出的猜敢,如果先啟動(dòng)datanode姑荷,datanode就會(huì)向log中寫入連接錯(cuò)誤直到namenodes被啟動(dòng)盒延。這說(shuō)明,datanode和namenode之間存在通信聯(lián)系鼠冕。這里就有通信方面的源碼實(shí)現(xiàn)可以研究添寺。我們暫且先不看這一塊。
當(dāng)然懈费,這是腳本的啟動(dòng)過(guò)程计露。我們需要在hadoop的源碼中啟動(dòng),但是要按照先啟動(dòng)namenode后啟動(dòng)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椭蹄。正常來(lái)說(shuō),不需要其它參數(shù)净赴,直接運(yùn)行即可绳矩。但是,我在運(yùn)行過(guò)程中遇到了一個(gè)錯(cuò)誤:
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.
我的錯(cuò)誤記錄忘記截圖了玖翅,這個(gè)是我在網(wǎng)上找的翼馆,一模一樣的。大概意思就是說(shuō)金度,文件權(quán)限不對(duì)应媚。
然后,我就根據(jù)調(diào)用的層次猜极,又開(kāi)始順藤摸瓜中姜,把hadoop默認(rèn)的文件權(quán)限改成了777。
發(fā)現(xiàn)還是有問(wèn)題跟伏。丢胚。。然后繼續(xù)順藤摸瓜受扳,(從DataNode.java)直到DataStorage.java中下面這個(gè)地方:
我把startOpt(估計(jì)是datanode啟動(dòng)方式)改成FORMAT携龟,datanode就奇跡般的可以正常啟動(dòng)了。然后勘高,我又改回原來(lái)的REGULAR峡蟋,datanode也可以正常啟動(dòng)了浮定。至于原因,我在截圖里做了猜測(cè)(datanode第一次啟動(dòng)可能也需要format)层亿。這時(shí)候桦卒,再把默認(rèn)權(quán)限改成755,也沒(méi)有問(wèn)題了匿又。
至此hdfs就成功啟動(dòng)了方灾。
為了驗(yàn)證hdfs已經(jīng)成功啟動(dòng),我們?cè)趆dfs的根目錄下創(chuàng)建一個(gè)test目錄碌更。從上一篇文章中裕偿,我們知道,在命令行里fs的操作都從rg.apache.hadoop.fs.FsShell這個(gè)入口進(jìn)痛单。我們?cè)趀clipse中找到這個(gè)入口嘿棘,然后在run configurations里給參數(shù) -mkidr /test。
然后我們?cè)儆?ls /檢驗(yàn)旭绒,運(yùn)行帶參數(shù)-ls /的FsShell:
然后鸟妙,我們?cè)诳刂婆_(tái)上可以看到:
由此,我們得到了驗(yàn)證挥吵。