最近一段时间学习了hadoop,对hadoop有了一定的了解。正好实验室有足够的机器,可以进行hadoop的完全分布式模式的安装和配置。今天尝试了下,虽然其中遇到些问题,但最后还是安装成功了,安装完也随手把安装过程记录下来以备将来不时之需。
我下载的hadoop的版本是1.1.2版本,机器上的jdk版本是1.6.0_38。
1.准备3台机器,一台作为主结点,另外两台作为从结点:
结点类型 | 主机名 | IP地址 |
主结点 | master | 202.114.24.84 |
从结点 | slave1 | 202.114.24.91 |
从结点 | slave2 | 202.114.24.89 |
注:修改机器的主机名方法如下:
>vi /etc/sysconfig/network
修改其中的HOSTNAME就可以了
2.配置/etc/hosts文件,在hosts文件末尾添加以下内容
202.114.24.84 master
202.114.24.91 slave1
202.114.24.89 slave2
3.为三台机器都建立相同的hadoop运行帐号,用户名都是grid,密码是root。
4.为三台机器配置ssh免密码接入。在每台机器上都以grid用户登录linux系统,并进入grid用户主目录进行如下操作:
>cd ~(grid用户的主目录)
>ssh-keygen -t rsa
(系统会交互式的问你若干个问题,可以不管它们,一直按enter键直到结束)
结束后,..ssh目录下会生成两个文件,一个是id_rsa,一个是id_rsa.pub,进行以下操作:
>cp .ssh/id_rsa.pub .ssh/authorized_keys
三台机器都完成上述操作之后,需要把各自的authorized_keys的内容拷贝到对方的authorized_keys文件中,可以进行如下操作:
slave1:>scp /home/grid/.ssh/authorized_keys grid@master:/home/grid
在主结点的机器上,把slave1的authorized_keys文件的内容拷贝到master的authorized_keys文件中
slave2:>scp /home/grid/.ssh/authorized_keys grid@master:/home/grid
在主结点的机器上,把slave2的authorized_keys文件的内容拷贝到master的authorized_keys文件中
接着把master的authorized_keys文件拷贝到slave1和slave2上,覆盖原先在.ssh目录下的authorized_keys文件,也就是说三台机器中的authorized_keys文件中的内容是相同的。
最后用如下命令测试三台机器是否可以免密码接入:
>ssh slave1
>ssh slave2
如果没有提示说要输入密码,证明配置成功。
5.在主结点上进行hadoop的有关配置。
1)配置/hadoop-1.1.2/conf/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.6.0_38
2)配置/hadoop-1.1.2/conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
3)配置/hadoop-1.1.2/conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
4)配置/hadoop-1.1.2/conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://master:9001</value>
</property>
</configuration>
5)配置/hadoop-1.1.2/conf/masters
6)配置/hadoop1.1.2/conf/slaves
slave1slave2
6.向各结点分发hadoop,执行如下命令:
>scp -r /home/grid/hadoop-1.1.2 grid@slave1:/home/grid
>scp -r /home/grid/hadoop-1.1.2 grid@slave2:/home/grid
注:三台机器上的jdk安装路径都是/usr/java/jdk1.6.0_38
7.格式化namenode,在master上运行如下命令:
>bin/hadoop namenode -format
8.启动hadoop,运行如下命令:
>bin/start-all.sh
starting namenode, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-namenode-master.out
slave2: starting datanode, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-datanode-slave2.out
slave1: starting datanode, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-datanode-slave1.out
master: starting secondarynamenode, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-secondarynamenode-master.out
starting jobtracker, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-jobtracker-master.out
slave2: starting tasktracker, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-tasktracker-slave2.out
slave1: starting tasktracker, logging to /home/grid/hadoop/libexec/../logs/hadoop-grid-tasktracker-slave1.out
9.验证hadoop,运行如下命令:
1)jps验证
[grid@master hadoop]$ /usr/java/jdk1.6.0_38/bin/jps
6320 NameNode
6510 SecondaryNameNode
6714 Jps
6609 JobTracker
[grid@master hadoop]$ ssh slave1
Last login: Sat Dec 7 09:12:18 2013 from master
[grid@slave1 ~]$ /usr/java/jdk1.6.0_38/bin/jps
5589 Jps
5243 TaskTracker
5124 DataNode
[grid@master hadoop]$ ssh slave1
Last login: Sat Dec 7 09:12:18 2013 from master
[grid@slave1 ~]$ /usr/java/jdk1.6.0_38/bin/jps
5589 Jps
5243 TaskTracker
5124 DataNode
2)hadoop dfsadmin -report验证
[grid@master hadoop]$ bin/hadoop dfsadmin -report
Configured Capacity: 96546455552 (89.92 GB)
Present Capacity: 56643620894 (52.75 GB)
DFS Remaining: 56643563520 (52.75 GB)
DFS Used: 57374 (56.03 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 2 (2 total, 0 dead)
Name: 202.114.24.89:50010
Decommission Status : Normal
Configured Capacity: 48273227776 (44.96 GB)
DFS Used: 28687 (28.01 KB)
Non DFS Used: 26456616945 (24.64 GB)
DFS Remaining: 21816582144(20.32 GB)
DFS Used%: 0%
DFS Remaining%: 45.19%
Last contact: Sat Dec 07 09:13:34 CST 2013
Name: 202.114.24.91:50010
Decommission Status : Normal
Configured Capacity: 48273227776 (44.96 GB)
DFS Used: 28687 (28.01 KB)
Non DFS Used: 13446217713 (12.52 GB)
DFS Remaining: 34826981376(32.44 GB)
DFS Used%: 0%
DFS Remaining%: 72.15%
Last contact: Sat Dec 07 09:13:34 CST 2013
3)网页验证
访问http://202.114.24.84:50030
访问http://202.114.24.84:50070
10.运行测试
[grid@master hadoop]$ mkdir test/
[grid@master hadoop]$ cd test/
[grid@master test]$ vim file1.txt
file1.txt:hello hadoop hello world
[grid@master test]$ vim file2.txt
file2.txt:goodbye hadoop
[grid@master hadoop]$ bin/hadoop dfsadmin -safemode leave
Safe mode is OFF
[grid@master hadoop]$ bin/hadoop dfs -put ~/hadoop/test/* input
put: `input': specified destination directory doest not exist
[grid@master hadoop]$ bin/hadoop fs -mkdir input
[grid@master hadoop]$ bin/hadoop dfs -put ~/hadoop/test/* input
[grid@master hadoop]$ bin/hadoop jar hadoop-examples-1.1.2.jar wordcount input output
注:其中output只能由程序创建,HDFS文件系统中不能事先存在.
11.停止hadoop
[grid@master hadoop]$ bin/stop-all.sh
stopping jobtracker
slave1: stopping tasktracker
slave2: stopping tasktracker
no namenode to stop
slave1: stopping datanode
slave2: stopping datanode
master: stopping secondarynamenode
至此,hadoop完全分布式模式安装成功。
从中遇到的问题:
1.在进行ssh免密码接入时老提示需要输入密码
原因:三台机器不是使用相同的用户名来进行ssh-keygen -t rsa 操作的
解决办法:为三台机器建立相同的用户名和密码(用户名:grid,密码:root),以grid用户进行所有的操作
2.报错org.apache.hadoop.conf.Configuration: bad conf file: element not property
原因:在三个xml配置文件中,把property写成了properity
解决办法:properity修改成property
3.在master上执行stop-all.sh命令时,出现no namenode to stop
原因:在/etc/hosts文件中,多了一句127.0.0.1 master,即主机名master被解析的ip地址为127.0.0.1,而不是202.114.24.84
解决办法:把这句127.0.0.1 master删掉即可
4.在slave1上运行jps命令时,发现没有datanode进程
原因:在master节点上执行了太多次hadoop namenode -format命令,导致datanode不能启动
解决办法:把三台机器上的hadoop_tmp下的所有文件删除,之后再在master节点上执行hadoop namenode -format命令,再执行start-all.sh来启动hadoop,问题解决
5.修改三台机器的hdfs-site.xml文件,在其中加入:
<property>
<name>dfs.data.dir</name>
<value>/home/grid/hadoop/data</value>
</property>
<property>
并在三台机器上建立/home/grid/hadoop/data文件,重新启动hadoop后发现datanode并没有启动
解决办法:查看slave1上/logs中的日志,看到提示说data目录的实际权限是rwxrwxr-x,而期望的时rwxr-xr-x,修改data目录的全权限为755即可
附:
1)重启坏掉的DataNode或JobTracker。当Hadoop集群的某单个节点出现问题时,一般不必重启整个系统,只须重启这个节点,它会自动连入整个集群。
在坏死的节点上输入如下命令即可:
bin/hadoop-daemon.sh start dataNode
bin/hadoop-daemon.sh start jobtracker
2) 动态加入DataNode或TaskTracker。这个命令允许用户动态将某个节点加入集群中。
bin/hadoop-daemon.sh --config ./conf start dataNode
bin/hadoop-daemon.sh --config ./conf start tasktracker