在eclipse下搭建hadoop开发环境各种问题的解决
这两天折腾在eclipse中写hadoop map-reduce jobs,遇到了以下问题:
1、无法配置ssh无密码登录
2、无法启动hadoop守护进程
3、hadoop-0.20.203.0的eclipse插件有问题
4、通过eclipse插件连接非本地hadoop伪分布式集群,出现“拒绝连接”
5、通过eclipse插件连接非本地hadoop成功后,权限不够、无法提交任务
解决如下:
环境:
ubuntu11.10 / centos6.2
hadoop-0.20.203.0
eclipse-java-indigo-SR1-linux-gtk-x86_64
配置过程:
1、准备
装好操作系统,安装jdk(参考http://blog.csdn.net/bhq2010/article/details/6839762)、ssh,centos6.2装上之后一般就带有openssh,在Services里面启用即可。
然后配置ssh无密码登陆,为安装伪分布式hadoop集群做准备,执行命令:
$ ssh-****** -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ ssh localhost
ubuntu很顺利,不用输入密码即可登陆。但在centos上配置ssh无密码登陆有点纠结,需要修改/etc/ssh/ssh_config文件和authorized_keys的权限(参考http://www.hackbase.com/tech/2011-07-21/64599.html)修改完最好把系统重启一下。
另外,不要将启动hadoop的用户的主目录加密,否则没法配置ssh无密码登陆(参考http://blog.csdn.net/bhq2010/article/details/7051383)。
2、安装Hadoop
从hadoop官网下载hadoop-0.20.203.0rc1.tar.gz到某个目录,如/srv,解压之,注意一定要将解压之后的目录及其子目录和文件的所有者改为将要启动hadoop的用户(参考http://blog.csdn.net/bhq2010/article/details/7054913)。
之后设置HADOOP_HOME和PATH环境变量。虽然不是必须的,但为了以后方便,建议设置一下。在/etc/profile文件末尾添加:
export HADOOP_HOME=/srv/hadoop-0.20.203.0
export PATH=$PATH:$HADOOP_HOME/bin
然后对hadoop进行配置,分别修改如下$HADOOP_HOME/conf中的6个文件:
hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、masters、slaves
具体的配置参考hadoop文档。但有一点需要注意:尽管配置的是伪分布式集群,建议不要在配置文件中使用localhost,因为如果使用localhost,以后在其他计算机上通过网络连接本机的hadoop时,会出现“拒绝连接”的情况(参考http://galpha.iteye.com/blog/1044355),我猜测这是因为hadoop的datanode是直接和用户建立连接的,不通过namenode,所以配置为localhost可能会导致用户试图和'localhost'上的datanode建立连接,故连接失败,猜测而已,目前没有能力去查证,还望指教。
另外,建议在core-site.xml中配置一下hadoop.tmp.dir:
<property>
<name>hadoop.tmp.dir</name>
<value>/esta/hadoop</value>
</property>
这是hdfs存放namenode名空间和datanode数据块的地方,可以设置为任意存在的目录,默认在/tmp/hadoop-username目录下,但是很多情况下,tmp目录不适合存放重要的数据。之后可以格式化hdfs、启动hadoop集群:
$ hadoop namenode -format
$ start-all.sh
如果遇到namenode启动失败,很可能是配置文件的问题。
如果遇到datanode启动失败,一般是没有成功格式化hdfs,实在无法解决的话,可以尝试将{hadoop.tmp.dir}清空,重新格式化hdfs。
用命令:
$ jps
察看是否启动成功,正常的情况下应该有5个与hadoop有关的项:
NameNode
SecondaryNameNode
DataNode
JobTracker
TaskTracker
通过浏览器打开http://localhost:50030和http://localhost:50070分别察看jobtracker和namenode的运行情况。
3、配置eclipse插件
hadoop-0.20.203.0的eclipse插件缺少jar包,需要手动修改一下,参考http://hi.baidu.com/wangyucao1989/blog/item/279cef87c4b37c34c75cc315.html
如果连接其他机器上的hadoop失败的话:
1、关闭防火墙
2、关闭远程机器上hadoop的safemode:
$ hadoop dfsadmin -safemode leave
此外,即使连接上了远程机器也可能会出现:
org.apache.hadoop.security.AccessControlException:Permission denied...
的问题,解决方法是:
在$HADOOP_HOME/conf/hdfs-site.xml中加入:
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
重新启动远程机器上的hadoop,重新链接后即可解决。