hadoop的集群配置以及map-reduce eclipse开发环境设置常见问题以及解决方法

Jul 20, 2011

今年暑假晚回家,实验室的老师让我做一个基于hadoop的分布式新浪微博好友关系爬虫。折腾了快一周时间总算是完成任务了,下面就我在hadoop集群环境配置,以及利用搭建eclipse的map reduce开发环境中遇到的问题做一下简要的记录。写这篇文章的主要目的是帮助那些跟我遇到类似问题的悲剧的家伙,所以请容我略去诸如“hadoop的配置过程”“XXX下hadoopX-X-X的配置手册”之类网络上到处都有的内容,以下着重介绍在集群和开发环境搭建过程中遇到的各种各样的问题和解决方法。

一、hadoop运行出错的情况

我用的hadoop 0.20.2(至于为什么用这个版本的hadoop是有原因的,下文会有提到),总体来说hadoop的集群配置还是很简单的。下面是几个需要注意的问题:

000.确保你的安装路径正确

hadoop要求集群中的所有master和slave的hadoop安装路径一致。最简单的方法就是为所有的master和slave创建相同的用户,相同的用户家目录,然后在其家目录下部署hadoop。这样也比较方面管理。

001.确保各个主机的hosts正确

确保集群中的每台服务器的hosts文件都包含集群中其他服务器的名称和域名的映射。如果你没有完成这一步,而是用IP地址代替hostname完成配置文件,虽然这样的配置本身没有问题,但是在运行过程中datanode是会直接引用namenode的hostname的。如果没有完成以上操作你会发现tasktraker或者datanode的log中出现了一堆hostname无法解析的错误信息。

确保localhost指向127.0.0.1并且确保本机名和本机ip映射正确,否则会出现每次运行到map 0% reduce 0%的时候停住的情况。由于我在以前配置别的服务器的时候把localhost改成了127.0.1.1,每次运行map-reduce的时候都出现假死状态,导致在配置hadoop的时候浪费了很长时间。

011.确保ssh正确

集群中的datanode到namenode的ssh登录都是免用户名免密码的。如果要求在slave中就能stop hadoop则需要namenode到datanode的ssh免用户名免密码登录。免密码登录很简单:生成密钥添加到目标服务器目标用户的~/.ssh/authorized_keys文件。如果目标服务器有多个用户,为了确保ssh登录对应的是hadoop用户,需要为ssh指定用户名:在本地服务器的.ssh目录下添加config文件即可,文件内容如下:

HOST 【目标服务器IP】
USER  【目标服务器上的hadoop用户名】

同时为了避免每次启动和结束hadoop的时候提示输入密码,需要把本机的ssh密钥追加到本机hadoop用户的~/.ssh/authorized_keys.

010.确保配置文件正确

较老版本的hadoop所有的配置信息都是写在hadoop-site.xml这个文件中的。新版本的hadoop没有这个配置文件,注意,不要自己去创建hadoop-site.xml文件然后填写配置信息。新版本的配置信息是存储在core-site.xml hdfs-site.xml 以及 mapred-site.xml这三个文件中的。每个配置文件存储的信息不同,注意不要写混了,否则可能会出现hadoop找不到配置信息,导致jobtracker等无法启动的情况(jps命令可以查看当前运行的java进程)。

最后,注意hadoop-env.sh中的java是否正确

110.防止数据错乱,确保log完整

由于分布式架构中数据存储在各个节点,不要用普通文件操作的方式管理hadoop.tmp.dir中的文件,管理文件分布式系统中的数据使用hadoop自带的命令。

hadoop是通过读取log文件获取系统状态和其他信息的,贸然删除某个节点的log信息可能导致无法挽回的后果。所有的log都由hadoop自动清理。

111.datanode无法启动?

hadoop在刚启动的一段时间内会处于安全状态,用

./hadoop dfsadmin -report

即可查看当前datanode的状态,有时候会出现0 datanode 0 dead的情况,如果这种情况出现在hadoop刚开始运行时的一段时间内,其实是正常的,只需耐心等待即可(namenodeIP:50030你会发现当前hadoop的状态是“initalize”)。

如果以上命令返回的结果发现了datanode,但是safemode依然是ON,这时候你可以手动关闭安全模式:

./hadoop dfsadmin safemode -leave

如果你不属于上述两种情况,那可能真的是datanode有问题,在hadoop配置没有问题的前提下,暂时已知的三种原因: 没有关闭防火墙;hadoop.tmp.dir目录无效;以及,

调整了hadoop-env.sh里面的hadoop-heap之后,某些datanode不能启动,也没有错误信息,这是由于heap的大小已经超出了datanode的内存,datanode在启动jvm时出错。

二、map-reduce eclipse开发环境配置

配置过程很简单,把hadoop目录下的contrib/eclipse-plugin/hadoop-0.20.2-eclipse-plugin.jar复制到eclipse的plugin目录下,启动eclipse即可,网上有人说要选择java编译器的等级为5,个人推荐选6,在等级为5的编译器下会有部分程序报错。
关于map-reduce eclipse开发环境的配置主要是围绕hadoop版本和eclipse版本的选择:
最新的hadoop版本无法在eclipse上运行,这也是我为什么选择hadoop0.20.2的原因。同时eclipse3.3以后的版本无法和hadoop的eclipse插件很好的结合。

查了接近两天的资料和反复尝试,最后选择了eclipse 3.3以及hadoop0.20.2。经本人亲测,eclipse下的map-reduce环境运行正常,除了DFS locations的更新有问题,强烈建议不要通过DFS Locations上传或者删除文件。 eclipse 3.3下载地址

三、其他错误总结

四、暂时写这么多,以后再扩充

Comments

  1. 没想到能抢到沙发,太让人兴奋了, 从前我都是只看贴不留言, 现在想想真是太傻了, 看别人的留言都可以被google查到, 这是多么幸福的事情啊. 为了能够在google上留下我的足迹, 我也要努力的留言, 多枪沙发. 今天我抢到了第一个沙发, 感慨万千, 万千言语化为一句话: 顶!

    Avatar
  2. 我用的hadoop 0.20.2(至于为什么用这个版本的hadoop是有原因的,下文会有提到)

    下文呢?。

    Avatar

Get In Touch With Us ...