您的位置:首页 > 运维架构

hadoop 1.x集群搭建及搭建过程遇到的问题总结

2013-07-22 11:15 716 查看




交流群:335671559
hadoop集群搭建

Hadoop集群搭建
Master机的ip地址假定为192.168.1.1 slaves1的假定为192.168.1.2 slaves2的假定为192.168.1.3
各台机器的用户同为redmap, hadoop 根目录为: /hadoop(即直接在filesystem里装得hadoop)

(1) 192.168.1.1 redmap-master 作为 Namenode, JobTracker, SecondaryNameNode

(2) 192.168.1.2 redmap-slaves1 作为 Datanode, TaskTracker

(3) 192.168.1.3 redmap-slaves2 作为 Datanode, TaskTracker
配置
首先,需要配置各个机器间的相互访问:
1、按照上面的设置修改各台机器(包括master和slaves)的host文件,保证机器可正常通信。在master机上的hosts文件(相关部分)为:
127.0.0.1 localhost

192.168.1.1 redmap-master

192.168.1.2 redmap-slaves1

192.168.1.3 redmap-slaves2
其他机器host内容相同(红色字部分)。
2、 配置ssh的自动登陆(在master机上):
$ ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
完成后会在~/.ssh/生成两个文件:id_dsa 和id_dsa.pub。

再把id_dsa.pub 追加到授权key 里面(当前并没有authorized_keys文件):
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
完成后可以实现无密码登录本机:
$ ssh localhost
3、把master上的id_dsa.pub 文件追加到2和3的authorized_keys 内( 以slaves1节点为例):
#拷贝master的id_dsa.pub文件(在master号机器上执行)

$ scp id_dsa.pub redmap@192.168.1.2:/home/maple/
注:(只需在主节点上运行ssh-kegen程序。其他节点的目录结构创建后,将刚才在主节点创建的keys通过scp拷贝到从节点的同样的目录上。)
我们在实际执行中是手动把id_dsa.pub拷贝到两个slaves的节点中,而不是用scp命令。最好是直接手动拷贝过去,这样文件的权限是一致的。
登录192.168.1.2,进入/目录执行:

$ cat id_dsa.pub >> .ssh/authorized_keys

之后可以在master上不输入密码直接SSH访问slaves1
4、 配置集群node文件
在master机器(namenode, 192.168.1.1)上完成

5、修改conf/目录下的master文件,内容如下:

redmap-master(namenode)

6、修改conf/目录下的slaves文件,内容如下:

redmap-slaves1(datanode)

redmap-slaves2(datanode)
7、修改conf/hadoop-env.sh文件的环境变量(master和slaves环境变量一致):
# The java implementation to use. Required.

export J***A_HOME=/usr/java/jdk1.6
8、修改conf/core-site.xml配置文件,内容如下:

< ?xml version=”1.0″?>

< ?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

< !– Put site-specific property overrides in this file. –>

<configuration>

< property>

< name>hadoop.tmp.dir</name>

< value>/

hadoop/tmp</value>

< description>A base for other temporary directories.</description>

< /property>

< property>

< name>fs.default.name</name>

< value>hdfs://redmap-master:9000</value>

< /property>

< /configuration>

9、修改conf/hdfs-site.xml配置文件,内容如下:

< ?xml version=”1.0″?>

< ?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

< !– Put site-specific property overrides in this file. –><configuration>

<property>

< name>dfs.replication</name>

< !–

设置一个数据块存储的份数–>

<value>1</value>

< /property>

<property>

< name>dfs.data.dir</name>

< value>/

hadoop/hadoopfs/data</value>

< /property>

< property>

< name>dfs.name.dir</name>

< value>/hadoop/hadoopfs/name</value>

< /property>

< /configuration>

10、修改conf/mapred-site.xml配置文件,内容如下:

< ?xml version=”1.0″?>

< ?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

< !– Put site-specific property overrides in this file. –>

<configuration>

< property>

< name>mapred.job.tracker</name>

< value>redmap-master:9001</value>

< /property>

< /configuration>

11、修改/ect/profile配置文件,在末尾追加以下内容,并输入source/etc/profile使之生效:

export J***A_HOME=/usr/java/jdk1.6

export JRE_HOME=/usr/java/jdk1.6/jre

export CLASSPATH=.:$J***A_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=$J***A_HOME/bin:$PATH

export HADOOP_HOME=/hadoop/

export PATH=$HADOOP_HOME/bin:$PATH

12. 分发集群软件到各个机器:

使用

tar和scp命令将master机器上的hadoop目录打包分发到其他机器对应的目录下:

$tar -caf hadoop.tar.gz hadoop

$scp -C hadoop.tar.gz

repmap@192.168.1.2:/ hadoop/

/ect/profile

和/etc/hosts也要相应保持一致注意profile需要做生效操作。

注:实际中,我们也是手动把hadoop.tar.gz拷贝到两个slaves

使用
配置完成后,就可以使用hadoop了:

1、 启动前需要格式化HDFS文件系统。进入hadoop/bin目录。执行:

hadoop namenode –format

2、在bin目录下,执行:hadoop fs -ls / 如果控制台返回结果,表示初始化成功。可以向里面录入数据。

启动 bin/start-all.sh

停止 bin/stop-all.sh

一、常见问题:

(1).当在格式化namenode时出现cannot create directory /usr/local/hadoop/hdfs/name/current的时候,请将hadoop的目录权限设为当前用户可写sudo chmod -R a+w /usr/local/hadoop,授予hadoop目录的写权限


(2).当碰到192.168.30.6:chown:changing ownership of 'usr/local/hadoop ../logs':operation not permitted时,可用sudo chown -R test:test /usr/local/hadoop来解决,即将hadoop主目录授权给当前test用户


(3).如果slaves机上通过jps只有TaskTracker进程,没有datanode进程,请查看日志,是不是有“could only be replicated to 0 nodes,instedas of 1”有这样的提示错误,如果有,可能就是没有关闭防火墙所致,服务器和客户机都关闭(sudo ufw disable)后,所有进程启动正常,浏览器查看状态也正常了

(4).要在服务器机上把masters和slavs机的IP地址加到/etc/hosts,当然这个不影响start-all.sh启动,只是浏览器jobtacker上找不到节slaves节点

(5).ssh免密码登陆时,注意文件authorized_keys和.ssh目录权限,如果从masters机上scp authorized_keys到slaves机上出现拒绝问题,那就在salves机上也ssh-keygen,这样目录和文件就不会有权限问题了,就可以实现ssh免密码登陆了,或直接将.ssh目录拷过去,在slaves机上新建.ssh目录权限好像和masters机的目录权限不一样

(6)如果hadoop启动时,slave机报连接拒绝错误,即连不上master9000端口,则namenode运行不起来时,可以先确保单机是不是可以正常运行伪分布式模式,可能是因为没有做ssh localhost,也可以查看是不是/etc/hosts文件IP映射有问题,一定注意该机的IP地址是不是唯一映射一个服务器名,不然可能也会出错。

(7)如果hadoop启动时,slave机报连接拒绝错误,即连不上master9000端口或者slave机datanode和tasktracker无法启动

还有可能是防火墙没有关闭,需要关闭master和所有slave机的防火墙。例如

使用root用户执行命令:

>stop-all.sh

>service iptables stop

>start-all.sh

Call to master/192.168.56.101:9000 failed on local exception: java.net.NoRouteToHostException: No route to host

1.http://wiki.apache.org/hadoop/ConnectionRefused

2.http://ubuntuforums.org/showthread.php?t=1057604

3.http://www.hadoopor.com/thread-1056-1-1.html

(8)如果启动datanode失败,日志中显示问题是org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid
则删除hdfs-site.xml中配置的dfs.data.dir的目录,重新启动hadoop时会重新创建这个目录。

(9)如果是使用多台局域网机器搭建集群,一定要保证每台机器的IP地址不会动态改变,如果动态改变会导致启动不了相应的节点,所以机器的IP最好是手动配置,而不是自动获取。

二、运行正常后,可以用wordcount例子来做一下测试:

bin/hadoop dfs –put /home/test-in input //将本地文件系统上的 /home/test-in 目录拷到 HDFS 的根目录上,目录名改为 input

bin/hadoop jar hadoop-examples-0.20.203.0.jar wordcount input output

#查看执行结果:

# 将文件从 HDFS 拷到本地文件系统中再查看:

$ bin/hadoop dfs -get output output

$ cat output/*

# 也可以直接查看

$ bin/hadoop dfs -cat output/*

(1)如果在reduce过程中出现"Shuffle Error:Exceeded MAX_FAILED_UNIQUE_FETCHES;bailing-out"错误,原因有可能是/etc/hosts中没有将IP映射加进去,还有可能是关于打开文件数限制的问题,需要改vi /etc/security/limits.conf,详情请看:Hadoop常见问题及解决办法



(2)如果是一个master机和一个slave机,做wordcount测试,是不会报上述错误的,不知道为什么两台slave机后,就报上述错误,解决方案如下(将masters机和其中一台slaves机中的/etc/hosts中masters机的IP映射地址改成服务器的名字,而不是IP地址):

1.http://hi.baidu.com/daodaowuhen/blog/item/b299b486f6c8aea86c811996.html

2.http://blog.sina.com.cn/s/blog_6e7e94bc0100pcjw.html



(3)如果需要在Eclipse上运行MapReduce程序,需要将hadoop目录下的eclipse插件(hadoop/contrib/eclipse-plugin)拷到eclipse安装目录下的plugins下。此时可以把hadoop的测试例子wordcount从src/examples中拷到eclipse工程中,在open run dialog的arguments中设置好输入和输出参数,然后run as->java application就可以了



(4)如果要run as->run on hadoop,即要在集群上运行MapReduce程序,则需要设置hadoop location,设置好master的namenode和jobtracker的IP及端口号,能正确连到DFS Locations就表明可以分布式运行MapReduce程序了,本人在此过程中,先后遇到以下问题:

1.Connecting to DFS test has encountered a problem

这个原因是因为直接采用hadoop0.20.203.0和相应包下的eclipse插件,此时MapReduce viewer是出现了,但根本连不上DFS,查了很多资料,很多说是因为hadoop下的eclipse插件和eclipse版本不匹配



参考资料1:http://lucene.472066.n3.nabble.com/about-eclipse-plugin-td3047557.html

参考资料2:自己动手编译对应hadoop版本的eclipse plugin



按照上面两条解决方案,我选择了第一种,虽然前一种hadoop是0.20.2的版本,但已经有编译好的可以用的eclipse插件,还有o.20.203这个版本是今年5月份出来的,还比较新,问题暴露的还少,而第二种解决方案需要自己配置编译,好像还要用ant命令,这个工具还没用过,所以免得麻烦



2.error:call to failed on local exception:java.io.EOFException

原因如下:eclipse-plugin和Hadoop版本对不上(因为刚开始不想换hadoop版本,就直接把那个插件(hadoop-plugin-0.20.3-snapshot.jar)拷到0.20.203版本里跑了一下,结果报上面的错,后来将hadoop版本换成hadoop0.20.2就好了)

参考资料:http://lucene.472066.n3.nabble.com/Call-to-namenode-fails-with-java-io-EOFException-td2933149.html



3.Plug-in org.apache.hadoop.eclipse was unable to load class

org.apache.hadoop.eclipse.launch.HadoopApplicationLaunchShortcut.

可以尝试将终端切到eclipse目录下用./eclipse clean来将以前载过的hadoop插件清除掉,我遇到这个错误后,这样操作后就好了。

参考资料:http://www.cloudobjects.de/2010/11/running-hadoop-jobs-using-eclipse.html



4.使用hadoop插件配置location时,如果location 中的map/reduce master 中host的配置和hadoop配置文件中的不一致,会导致出现连不上本地dfs的问题,比如hadoop
安装目录中/conf目录下,core-site.xml、mapred-site.xml、master和slaves这四个文件使用localhost,而在eclipse中配置location时用12.0.0.1作为连接,就会出错,报错误如下:

wrong FS hdfs://127.0.0.1......

can not call to ........

5.找不到配置好的location,在eclipse右侧列表无法显示

可能没有切换窗口,不要选择Java 或者Java EE窗口,而是选择Map/Reduce 窗口,这样右侧列表就会显示配置好的location





窗口布局(



open
perspective)

列表显示:




本文章参考了网络上一些文章,再加上自己在配置过程遇到的问题,重新总结了一些。

参考:http://blog.csdn.net/aidayei/article/details/6555255
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: