开始着手学习hadoop了,撇开对hadoop的认识,面对的第一个问题幷是hadoop的分布式部署,网上有很多教程,按照这些教程来却或多或少有些不顺利的地方。在此详细的记录下自己的安装过程。
服务器操作系统是CentOS6,部署的hadoop版本是0.20.2,共十台服务器,node1~node10。其中node1做为NameNode,node10作为SecondNameNode,node2~node9作为DataNode。
由于之前没有怎么接触过linux操作系统,刚开始安装的过程中遇到了很多现在看来很简单,当时却困扰自己很久的问题。
1,安装hadoop前,需要安装java,java版本得是1.6.以上的,还需要安装ssh。
java安装完后,在~/.bash_profile中添加JAVA_HOME,PATH,CLASS_PATH. 注意PATH变量中,多个值之间用的是":"冒号。
2,配置SSH,NameNode启动其他服务器上的进程免去登陆这一环节。在配置ssh前,先为hadoop系统创建用户。每个节点上都要做同样的操作。
1 groupadd hadoopcluster
2 useradd -g hadoopcluster hadoop
3 passwd hadoop //创建密码
创建hadoop用户后,切换到hadoop用户来,在~目录下创建文件夹
1 mkdir .ssh
随后开始配置ssh免登陆:注意,这个操作只在NameNode上操作。
1 ssh-keygen -t rsa // 接下来一路回车,则ok
2 cp id_rsa.pub authorized_keys //进入.ssh目录
接下来,并将生成的authorized_keys拷贝到所有其他节点下去。注意:node2为hostname,可以改为该节点的IP地址,为了以后方便,在/etc/hosts里面增加各个节点的ip地址和hostname。如增加一行:192.168.1.12 node2
1 scp authorized_keys node2:/home/hadoop/.ssh
在scp过程中会需要你输入密码,输入这一次以后再也不用输入了,这样ssh的无密码登陆就完成了。拷贝完成后,要修改authorized_keys文件的权限:
1 chmod 644 authorized_keys//在root权限下操作
3,开始部署hadoop,在NameNode 节点上,使用Hadoop用户,解压hadoop的文件夹,由于服务器上不了网,只能先下载下来,再通过xftp将hadoop的文件上传到服务器上去。
解压之后,进入conf目录。主要配置core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml masters slaves 五个文件。
在hadoop-env.sh 文件中:主要添加java环境变量
1 export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
在core-site.xml文件中:
1 <property>
2 <name>hadoop.tmp.dir</name>
3 <value>/opt/hadoop/tmp</value>
4 </property>
5 <property>
6 <name>fs.default.name</name>
7 <value>hdfs://node1:54310</value>
8 </property>
在hdfs-site.xml文件中:
1 <property>
2 <name>dfs.replication</name>
3 <value>3</value>
4 </property>
5 <property>
6 <name>dfs.name.dir</name>
7 <value>/opt/hadoop/hdfs/name</value>
8 </property>
9 <property>
10 <name>dfs.data.dir</name>
11 <value>/opt/hadoop/hdfs/data</value>
12 </property>
13 <property>
14 <name>dfs.namenode.secondary.http-address</name>
15 <value>node10:50090</value>
16 </property>
在mapred-site.xml 文件中:
1 <property>
2 <name>mapred.job.tracker</name>
3 <value>node1:54311</value>
4 </property>
在slaves文件中,则添加DataNode节点的ip地址,一行一个如:192.168.1.1
在masters文件中,要注意,这个文件中添加的地址是指SecondNameNode的ip地址,配一个则一个SecondNameNode,多个则多个这样的节点。
这些配置完毕后,则,需要将hadoop的bin加入到环境变量中,在~/.bash_profile中添加类似于JAVA_HOME,PATH一样的变量,HADOOP_HOME 和 PATH。将这些配置好后,便将所有的hadoop文件scp到所有的其他节点上去,类似于之前scp authorized_keys 一样。
这样hadoop集群的简单配置基本上就完成了,随后的便是开始启动整个集群,看自己的辛勤劳动有个什么神奇的结果。
4,开始见证奇迹的发生了。
1 ./hadoop namenode -format //在hadoop bin目录下的操作,将数据节点格式化,如果顺利,会有一句successful的话
2 ./start-all.sh //则所有节点都启动了。
如果启动正常,则可以在浏览器中输入node1(ip地址):50070里面看到整个集群的相关信息。
注意在整个过程中,只从一个角度提到hadoop部署的,namenode和DataNode,其实在start-all之后,会发现打印出来的信息还有tasktracker,jobtracker,这样的字眼,他们是相对于mapreduce来说的。
由于在初次部署hadoop系统,还是出现了一些问题,在开始没有配置hosts文件时,系统在最后的一次start-all后,所有的数据节点就在打印同一条日志,结果很快就将300g的硬盘写满了。再次启动就是提示没有空间可以写了。
1 2012-02-21 00:00:01,074 ERROR org.apache.hadoop.mapred.TaskTracker:
Caught exception: java.net.UnknownHostException: unknown host: node1
这是由于DataNode没有配置hosts文件,无法将node1映射到相应的ip地址。
在配置hadoop过程中,也是自己第一次这么正式的接触linux系统,所以遇到了很多各种各样的问题,譬如总是搞错root用户和hadoop用户,在不同用户下创建的文件不同用户对他拥有的权限不一样,如果总是root用户创建,则hadoop用户没权限操作。
在配置path时,将两个参数中写成了";"分号,则在切换到hadoop用户时,总会出现一句~bash这样的语句,切换用户,系统总会执行bash_profile文件中指明的环境变量,到分号后就以为结束了,后面的语句则识别错误了。
在配置hadoop系统过程中,最好先操作官方的文档来,系统运行中出现问题,则多查看日志。多自己思考,总会解决问题的,这样也更多对问题有深入的了解,下次遇到了便立马知道错在什么地方,怎么解决了。
天道酬勤。