这里,我们省略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:
然后,我们在控制台上可以看到:
由此,我们得到了验证。