g假设当前已经安装了java6和ssh等一系列必需软件。所使用的hadoo版本为hadoop-0.20.2。
1. 必须为每台机子创建相同的用户,以进行hadoop操作。我们这里建立hadoop用户。
# roupadd -g 3000 hadoop # useradd -g 3000 -u 3000 hadoop //为hadoop用户添加登录密码 # passwd hadoop Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully //将/etc/passwd中hadoop的默认启动脚本从/bin/sh修改为/bin/bash,这样当用hadoop用户操作时,会比较方便(比如tab键自动补全等操作)。 # vim /etc/passwd //创建hadoop用户的根目录 # mkdir /home/hadoop //修改hadoop根目录的拥有者 # chown hadoop:hadoop /home/hadoop/
这样,每台机子的hadoop用户就建立好了。
2. 接下里,要使master的hadoop用户能够直接通过密钥ssh到slaves机子上。方法参见http://blog.csdn.net/wenlei_zhouwl/archive/2010/10/01/5917579.aspx。
通过以上操作,master用户就可以自动登录到slaves机子上了。
另外还要让master通过密钥ssh到自己机子上,让slaves通过密钥ssh到master机子上。
假设,现在有3台机子,一台机子master作为NameNode,JobTracker。另两台机子slave1、slave2作为DataNode,TaskTracker。
1. 在master主机上,将hadoop压缩包解压到/opt/文件夹下,并设置其拥有者为hadoop。
2. 设置{hadoop-install-dir}/conf/hadoop-env.sh内的环境变量JAVA_HOME。
3. 配置{hadoop-install-dir}/conf/core-site.xml,该文件中配置的是整个分布式系统的信息。其默认配置及介绍在{hadoop-install-dir}/src/core/core-default.xml中。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> <property> <name>dfs.name.dir</name> <value>/opt/hadoop-0.20.2/data/hdfs/NameNode</value> </property> <property> <name>dfs.data.dir</name> <value>/opt/hadoop-0.20.2/data/hdfs/DataNode</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-0.20.2/data/hdfs/tmp</value> </property> </configuration>
4. 配置{hadoop-install-dir}/conf/hdfs-site.xml,该文件中配置的是数据存储方面的信息。其默认配置及介绍在{hadoop-install-dir}/src/hdfs/hdfs-default.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> </configuration>
5. 配置{hadoop-install-dir}/conf/mapred_site.xml,该文件中配置的是mapreduce方面的信息。其默认配置及介绍在{hadoop-install-dir}/src/mapred/mapred_default.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>master:9001</value> </property> </configuration>
6. 在master上配置如何联系slaves。因为master作Namenode用,所以需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名。
1. 修改{hadoop-install-dir}/conf/masters的内容。
master
2. 修改{hadoop-install-dir}/conf/slaves的内容。
slave1 slave2
3. 修改/etc/hosts中的内容,添加下列内容。
172.16.8.20 master 172.16.8.21 slave1 172.16.8.22 slave2
这样,master机子配置完成。
7. 将master机子上的hadoop安装目录{hadoop-install-dir}整个拷贝到slave机子的相同目录(即/opt/)下,设置其拥有者为hadoop。设置{hadoop-install-dir}/conf/hadoop-env.sh内的环境变量JAVA_HOME。
8. 在slave1上配置如何联系master。对于slave,只需要在/etc/hosts文件中加上本机IP地址和Namenode机器的IP地址。
172.16.8.20 master 172.16.8.21 slave1
9. 在slave2上配置如何联系master。对于slave,只需要在/etc/hosts文件中加上本机IP地址和Namenode机器的IP地址。
172.16.8.20 master 172.16.8.22 slave2
10. 格式化NameNode,在master机子上,进入{hadoop-install-dir},运行指令
$ bin/hadoop namenode -format
11. 启动hadoop,进入master的{hadoop-install-dir}。在bin/下面有很多启动脚本,可以根据自己的需要来启动。
//start-all.sh启动所有的Hadoop守护。包括namenode,datanode,jobtracker,tasktrack //stop-all.sh停止所有的Hadoop //start-mapred.sh启动Map/Reduce守护。包括Jobtracker和Tasktrack //stop-mapred.sh停止Map/Reduce守护 //start-dfs.sh启动HadoopDFS守护.Namenode和Datanode //stop-dfs.sh停止DFS守护 //比如我要启动所有守护程序,只需要输入 $ bin/start-all.sh //如果要停止,只需要输入 $ bin/stop-all.sh
通过上述步骤,hadoop搭建成功,至于更细节的设置,以后再细细研究。
12. 查看进程情况:
jps可以用来查看当前hadoop运行的进程情况。
bin/hadoop dfsadmin –report可以用来查看当前hadoop的运行情况。
13. 问题1:
如果删掉了namenode的tmp.dir,那么在重新bin/hadoop namenode –format,并启动时,datanode容易出现类似问题:java.io.IOException: Incompatible namespaceIDs in /home/hadoop/data: namenode namespaceID = 1214734841; datanode namespaceID = 1600742075。
解决方法:
删除所有机子上的tmp.dir,并重新bin/hadoop namenode –format。
13. 问题2:
运行mapreduce时报错:could only be replicated to 0 nodes, instead of 1。
解决方法:
删除所有机子上的tmp.dir,并重新bin/hadoop namenode –format。