本文主要介绍在集群上部署hadoop,构建HDFS,为后面运行map/reduce程序做准备
前期准备:
下载hadoop: http://hadoop.apache.org/core/releases.html
硬件环境
共有3台机器,均使用的CentOS,Java使用的是jdk1.6.0。
IP配置如下:
hadoop:192.168.9.212
test:192.168.9.111
test2:192.168.9.211
对于Hadoop来说,在HDFS看来,节点分为Namenode 和Datanode,其中Namenode只有一个,Datanode可以是很多;在 MapReduce看来,节点又分为Jobtracker和 Tasktracker,其中Jobtracker只有一个,Tasktracker可以是很多。
所以通常有两台master,一台作为NameNode,一台作为JobTracker,剩下的都为slaves,同时当做DataNode和 TaskTracker使用.
当然也可以将NameNode和JobTracker都放在一台master上面.
这里让hadoop做为master和Jobtracker,test和test2作为DataNode和TaskTracker
修改hosts文件,要确保每台机器的主机名和IP地址之间能正确解析,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名,如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。
[root@hadoop ~]# vi /etc/host 127.0.0.0 localhost 192.168.9.212 hadoop 192.168.9.111 test 192.168.9.211 test2 [root@test ~]# vi /etc/host 127.0.0.1 localhost 192.168.9.212 hadoop 192.168.9.111 test [root@test2 ~]# vi /etc/host 127.0.0.1 localhost 192.168.9.212 hadoop 192.168.9.211 test2
Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户。
分别在三台机器上新增用户hadoop,密码hadoop,主目录是/home/hadoop
[root@hadoop ~]#su hadoop
建立HadoopInstall目录,解压,为了方便以后升级建立软链接
[hadoop@hadoop ~]$ mkdir /home/hadoop/HadoopInstall [hadoop@hadoop ~]$ tar zxvf hadoop-0.17.2.1.tar.gz -C HadoopInstall/ [hadoop@hadoop ~]$cd HadoopInstall
这里定义{HADOOP_HOME}为/home/hadoop/HadoopInstall/hadoop,下面提到{HADOOP_HOME}替换下就行.
为了方便升级,建立软链接并且将配置文件与安装目录分离
[hadoop@hadoop ~]$ln -s hadoop-0.17.2.1 hadoop [hadoop@hadoop ~]$mkdir /home/hadoop/hadoop-conf
将{HADOOP_HOME}/conf/下hadoop-env.sh ,hadoop-site.xml, masters,slaves四个文件copy到/home/hadoop/hadoop-conf中
指定环境变量 $HADOOP_CONF_DIR指向该目录。
[hadoop@hadoop ~]$ echo 'export HADOOP_CONF_DIR=$HOME/HadoopInstall/hadoop-conf/' >> .bashrc
也可以在全局环境变量/etc/profile中设定。
SSH设置
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个datanode上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
以本文中的三台机器为例,现在hadoop是主节点,他需要连接test和test2。需要确定每台机器上都安装了ssh,并且datanode机器上sshd服务已经启动。
[hadoop@hadoop ~]$ssh-keygen -t rsa
这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下
然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/dbrg/.ssh /authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.
[hadoop@hadoop ~]$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
复制到test和test2上
[hadoop@hadoop .ssh]$ scp authorized_keys test:/home/hadoop/.ssh/ [hadoop@hadoop .ssh]$ scp authorized_keys test2:/home/hadoop/.ssh/
输入 yes 来继续。这会把该服务器添加到你的已知主机的列表中
The authenticity of host ‘test (192.168.9.111)’ can’t be established.
RSA key fingerprint is 03:e0:30:cb:6e:13:a8:70:c9:7e:cf:ff:33:2a:67:30.
Are you sure you want to continue connecting (yes/no)?
这里会提示输入密码,输入hadoop账号密码就可以了。
改变你的 authorized_keys 文件的许可权限:
[hadoop@hadoop .ssh]$chmod 644 authorized_keys
检查下是否配置成功,从hadoop机器上ssh到test和test2,如果不需要输入密码则配置成功,如果还需要请检查上面的配置是否正确。
[hadoop@hadoop ~]$ ssh test [hadoop@hadoop ~]$ ssh test2 [hadoop@hadoop ~]$ vi /home/hadoop/HadoopInstall/hadoop-conf/hadoop-env.sh 指定JAVA_HOME和HADOOP_HOME export JAVA_HOME=/usr/local/java export HADOOP_HOME=/home/hadoop/HadoopInstall/hadoop
配置
主要的配置文件{HADOOP_HOME}/conf目录下面
1. hadoop-default.xml – 不要修改此文件.
2. hadoop-site.xml – 通过修改这个文件覆盖hadoop-default.xml中的选项达到配置的目的.
[hadoop@hadoop ~]$ more /home/hadoop/HadoopInstall/hadoop-conf/hadoop-default.xmlfs.default.name hdfs://hadoop:9000/ mapred.job.tracker hadoop:9001 hadoop.tmp.dir /home/hadoop/HadoopInstall/tmp dfs.name.dir /home/hadoop/HadoopInstall/filesystem/nameDetermines dfs.data.dir /home/hadoop/HadoopInstall/filesystem/dataDetermines dfs.replication 1 mapred.child.java.opts -Xmx512m
将hadoop添加到masters文件中
[hadoop@hadoop hadoop-conf]$ more /home/hadoop/HadoopInstall/hadoop-conf/smasters hadoop
将datanode添加到slaves文件中
[hadoop@hadoop hadoop-conf]$ more /home/hadoop/HadoopInstall/hadoop-conf/slaves test test2
将hadoop部署到其他的节点机器上,保证目录结构一致。
[hadoop@hadoop ~]$scp -r /home/hadoop/HadoopInstall test:/home/hadoop/ [hadoop@hadoop ~]$scp -r /home/hadoop/HadoopInstall test1:/home/hadoop/
格式化namenode
[hadoop@hadoop ~]$cd /home/hadoop/HadoopInstall/hadoop [hadoop@hadoop ~]$./bin/hadoop namenode -format 08/11/22 03:50:00 INFO dfs.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = hadoop/127.0.0.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 0.17.2.1 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.17 -r 684969; compiled by 'oom' on Wed Aug 20 22:29:32 UTC 2008 ************************************************************/ 08/11/22 03:50:00 INFO fs.FSNamesystem: fsOwner=hadoop,hadoop 08/11/22 03:50:00 INFO fs.FSNamesystem: supergroup=supergroup 08/11/22 03:50:00 INFO fs.FSNamesystem: isPermissionEnabled=true 08/11/22 03:50:00 INFO dfs.Storage: Storage directory /home/hadoop/HadoopInstall/filesystem/nameDetermines has been successfully formatted. 08/11/22 03:50:00 INFO dfs.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at hadoop/127.0.0.1 ************************************************************/
启动hadoop,这里调用start-all.sh 全部启动,也可以调用start-mapred.sh 和start-dfs.sh启动相应的守护程序。
[hadoop@hadoop ~]$./bin/hadoop start-all.sh
先检查namenode和各datanode上hadoop程序是否启动起来,并且关注/home/hadoop/HadoopInstall/hadoop/logs下的日志文件。
简单的DHFS操作
建立目录
[hadoop@hadoop ~]$./bin/hadoop dfs -mkdir hadooptest
在HDFS中建立一个名为hadooptest的目录
复制文件
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -put /home/home/hadoop-0.17.2.1.tar.gz hadoop-test.tar.gz
把本地文件hadoop-0.17.2.1.tar.gz拷贝到HDFS的根目录/user/hadoop/下,文件名为hadoop-test.tar.gz
查看现有文件
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -ls
更多相关命令可以查看帮助
[hadoop@hadoop bin]$ sh hadoop dfs
在执行上面命令,我出现过以下错误
2008-11-22 03:54:00,202 INFO org.apache.hadoop.ipc.Server: IPC Server handler 3 on 9000, call addBlock(/user/hadoop/hadoop-test.tar.gz,
DFSClient_1524625820) from 127.0.0.1:32894: error: java.io.IOException: File /user/hadoop/hadoop-test.tar.gz could only be replicated to
0 nodes, instead of 1
java.io.IOException: File /user/hadoop/testfil.tar.gz could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.dfs.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1145)
at org.apache.hadoop.dfs.NameNode.addBlock(NameNode.java:300)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:446)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:896)
2008-11-22 03:57:34,778 INFO org.apache.hadoop.fs.FSNamesystem: Roll Edit Log from 127.0.0.1
2008-11-22 03:57:34,778 INFO org.apache.hadoop.fs.FSNamesystem: Number of transactions: 8 Total time for transactions(ms): 0 Number
of syncs: 5 SyncTimes(ms): 19
2008-11-22 03:57:35,420 INFO org.apache.hadoop.fs.FSNamesystem: Roll FSImage from 127.0.0.1
2008-11-22 03:57:35,420 INFO org.apache.hadoop.fs.FSNamesystem: Number of transactions: 0 Total time for transactions(ms): 0 Number
of syncs: 0 SyncTimes(ms): 0
后经检查,发现iptables启动着,端口没放到允许列表中。关闭iptables后,正常。
问题排查
1、首先确定网络连接没有问题,没台机器都能ping通。
2、看看是否能访问以下连接,如果不能访问,请检查端口是否被占用或者被防火期阻止。
http://hadoop:50030/
http://hadoop:50030/jobtracker.jsp
3、仔细检查master和各slave的/home/hadoop/HadoopInstall/hadoop/logs下的文件,根据错误信息排查错误。
相关资料:
Hadoop集群搭建
http://hadoop.apache.org/core/docs/r0.18.2/cn/cluster_setup.html
Hadoop 官方网站,了解 Hadoop 及其子项目 HBase 的信息。
http://hadoop.apache.org/
IBM hadoop 应用系列文章
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/index.html
Related posts:
[...] 本文是在hadoop上运行你的第一个程序,以及如何进行本地调试。如果还没有部署好hadoop环境,请参考之前的文章hadoop在集群上的安装部署 [...]