BEOOP

不靠谱是一种态度

hadoop在集群上的安装部署

| 2 Comments

本文主要介绍在集群上部署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.xml



  fs.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

2 Comments

  1. Pingback: Hadoop上运行WordCount以及本地调试 | Beoop

发表评论

Required fields are marked *.

*