Hadoop既可以以单机模式运行,也可以以伪分布模式运行,这两种模式都是为了使用者方便学习和调试Hadoop,要想发挥Hadoop分布式、并行处理的优势,还须以分布式模式来部署运行Hadoop。单机模式是指Hadoop在单个节点上以单个进程的方式运行,伪分布模式是指在单个节点上运行NameNode、DataNode、JobTracker、TaskTracker、SeconderyNameNode5个进程,而分布式模式是指在不同节点上分别运行上述5个进程中的某几个,比如在某个节点上运行DataNode和TaskTracker。
伪分布模式和分布式模式除了上述的不同之处外,在配置上伪分布模式要简单的多,只需要修改core-site.xml、hdfs-site.xml、mapred-site.xml即可,而分布式模式则还需要配置masters和slaves等文件。在管理上,显然伪分布模式也要简单很多,毕竟只有一个节点,而分布式模式则至少存在两个节点,当节点数量很多时,Hadoop的复杂性也会相应的提高。
这篇文章主要介绍了以为分布式模式部署和运行Hadoop的一些细节及出现的问题,部署单节点的Hadoop相对容易些,但总是会出现这样那样的问题。首先按照官方文档的说明对core-site.xml、hdfs-site.xml、mapred-site.xml做相应的修改,具体的url为http://hadoop.apache.org/docs/r1.2.1/single_node_setup.html#PseudoDistributed。因为之前曾经学过Hadoop,所以在修改配置文件时不是完全按照官方文档的说明进行的,比如在hdfs-site.xm增加了dfs.name.dir和dfs.data.dir属性的配置,这两个属性的默认值为${hadoop.tmp.dir}/dfs/name和${hadoop.tmp.dir}/dfs/data,具体的就是/tmp/hadoop-${user.name}/dfs/name和/tmp/hadoop-${user.name}/dfs/data,其中${user.name}为运行Hadoop的用户名称。可见这两个属性将文件保存在节点中的/tmp目录下,而不同的Linux系统清理该目录的策略也是不同的,所以为了长期保留dfs.name.dir和dfs.data.dir中的值,修改了原有的默认值,第一次将其修改为了/home/hadoop/ hadoopData。
做完上述配置文件的修改后,在按照官方文档的说明进行ssh的配置,这样在进行ssh登录时可以不用输入密码口令。具体的代码如下:
[java] view plain copy print ?
- ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
- cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
或者将上面代码中的dsa改为rsa,两者的区别是所使用的加密算法不同。
然后就可以进行NameNode的格式化了,在命令行执行bin/hadoop namenode –format,格式化成功后,执行bin/start-all.sh。在终端打印消息后,执行jps命令查看是否存在NameNode、DataNode、JobTracker、TaskTracker、SeconderyNameNode这5个进程。执行jps后发现没有datanode进程,打开logs目录下的关于datanode的日志,发现下面的错误:
[java] view plain copy print ?
- WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /home/hadoop/ hadoopData, expected: rwxr-xr-x, while actual: rwxrwxr-x
- 2013-12-13 14:57:36,149 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid.
根据错误提示,修改/home/hadoop/hadoopData为rwxr-xr-x后重新格式化,然后启动hadoop,执行jps查看进程运行情况,发现datanode依然不存在。再次查看datanode的日志:
[java] view plain copy print ?
- 2013-12-13 16:08:57,516 INFO org.apache.hadoop.hdfs.server.common.Storage: Cannot lock storage /home/hadoop/hadoopData. The directory is already locked.
- 2013-12-13 16:08:57,632 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Cannot lock storage /home/hadoop/hadoopData. The directory is already locked.
- at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.lock(Storage.java:599)
- at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:452)
- at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:111)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:414)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:321)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1712)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1651)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1669)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1795)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1812)
根据提示可知/home/hadoop/hadoopData文件夹已经被其他进程锁定,导致datanode进程无法使用,检查配置文件发现dfs.name.dir和dfs.data.dir都配置为了/home/hadoop/hadoopData了,这导致了上述的错误。解决方法是将dfs.name.dir和dfs.data.dir分别设置为/home/hadoop/hadoopData和/home/hadoop/hadoopName,问题解决。