⼀步步教你Hadoop多节点集安装配置
1、集部署介绍
1.1 Hadoop简介
Hadoop是Apache软件基⾦会旗下的⼀个开源分布式计算平台。以Hadoop分布式⽂件系统HDFS(Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核⼼的Hadoop为⽤户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集来讲,可以分成两⼤类⾓⾊:Master和Salve。⼀个HDFS集是由⼀个NameNode和若⼲个DataNode组成的。其中NameNode作为主服务器,管理⽂件系统的命名空间和客户端对⽂件系统的访问操作;集中的DataNode管理存储的数据。MapReduce框架是由⼀个单独运⾏在主节点上的JobTracker和运⾏在每个从节点的TaskTracker共同组成的。主节点负责调度构成⼀个作业的所有任务,这些任务分布在不同的从节点上。主节点监控它们的执⾏情况,并且重新执⾏之前的失败任务;从节点仅负责由主节点指派的任务。当⼀个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执⾏。从上⾯的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核⼼。HDFS在集上实现分布式⽂件系
统,MapReduce在集上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了⽂件操作和存储等⽀持,MapReduce 在HDFS的基础上实现了任务的分发、跟踪、执⾏等⼯作,并收集结果,⼆者相互作⽤,完成了Hadoop分布式集的主要任务。
1.2 环境说明
虚拟机linux安装jdk
我的环境是在虚拟机中配置的,Hadoop集中包括4个节点:1个Master,2个Salve,节点之间局域⽹连接,可以相互ping通,节点IP地址分布如下:
虚拟机系统机器名称IP地址
Ubuntu 13.04Master.Hadoop192.168.1.141
Ubuntu 9.11Salve1.Hadoop192.168.1.142
Fedora 17Salve2.Hadoop192.168.1.137
Master机器主要配置NameNode和JobTracker的⾓⾊,负责总管分布式数据和分解任务的执⾏;3个Salve机器配置DataNode
和TaskTracker的⾓⾊,负责分布式数据存储以及任务的执⾏。其实应该还应该有1个Master机器,⽤来作为备⽤,以防⽌Master服务器宕机,还有⼀个备⽤马上启⽤。后续经验积累⼀定阶段后补上⼀台备⽤Master机器(可通过配置⽂件修改备⽤机器数)。
注意:由于hadoop要求所有机器上hadoop的部署⽬录结构要求相同(因为在启动时按与主节点相同的⽬录启动其它任务节点),并且都有⼀个相同的⽤户名账户。参考各种⽂档上说的是所有机器都建⽴⼀个hadoop⽤户,使⽤这个账户来实现⽆密码认证。这⾥为了⽅便,分别在三台机器上都重新建⽴⼀个hadoop⽤户。
1.3 环境配置
Hadoop集要按照1.2⼩节表格所⽰进⾏配置,下⾯介绍如何修改机器名称和配置hosts⽂件,以⽅便使⽤。
注意:我的虚拟机都采⽤NAT⽅式连接⽹络,IP地址是⾃动分配的,所以这⾥就使⽤⾃动分配的IP地址⽽未特地修改为某些IP地址。(1)修改当前机器名称
假定我们发现我们的机器的主机名不是我们想要的。
1)在Ubuntu下修改机器名称
修改⽂件/etc/hostname⾥的值即可,修改成功后⽤hostname命令查看当前主机名是否设置成功。
另外为了能正确解析主机名,最好也修改/etc/hosts⽂件⾥对应的主机名
2)在Fedora下修改机器名称
通过对"/etc/sysconfig/network"⽂件修改其中"HOSTNAME"后⾯的值,改成我们规定的名称。
命令:vi /etc/sysconfig/network,修改如下:
同样为了能正确解析主机名,最好也修改/etc/hosts⽂件⾥对应的主机名。
(2)配置hosts⽂件(必须)
"/etc/hosts"这个⽂件是⽤来配置主机将⽤的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName IP]⽤的。当⽤户在进⾏⽹络连接时,⾸先查该⽂件,寻对应主机名对应的IP地址。
我们要测试两台机器之间知否连通,⼀般⽤"ping 机器的IP",如果想⽤"ping 机器的主机名"发现不见该名称的机器(这也就是为什么在修改主机名的同时最好修改该⽂件中对应的主机名),解决的办法就是修改"/etc/hosts"这个⽂件,通过把LAN内的各主机的IP地址和HostName的⼀⼀对应写⼊这个⽂件的时候,就可以解决问题。
例如:机器为"Master.Hadoop:192.168.1.141"对机器为"Salve1.Hadoop:192.168.1.142"⽤命令"ping"记性连接测试。测试结果如下:
从上图中的值,直接对IP地址进⾏测试,能够ping通,但是对主机名进⾏测试,发现没有ping通,提⽰"unknown host——未知主机",这时查看"Master.Hadoop"的"/etc/hosts"⽂件内容会发现⾥⾯没有"192.168.1.142  Slave1.Hadoop"内容,故⽽本机器是⽆法对机器的主机名为"Slave1.Hadoop" 解析。
在进⾏Hadoop集配置中,需要在"/etc/hosts"⽂件中添加集中所有机器的IP与主机名,这样Master与所有的Slave机器之间不仅可以通过IP进⾏通信,⽽且还可以通过主机名进⾏通信。所以在所有的机器上的"/etc/hosts"⽂件中都要添加如下内容:
192.168.1.141 Master.Hadoop
192.168.1.142 Slave1.Hadoop
192.168.1.137 Slave2.Hadoop
命令:vi /etc/hosts,添加结果如下:
现在我们在进⾏对机器为"Slave1.Hadoop"的主机名进⾏ping通测试,看是否能测试成功。
从上图中我们已经能⽤主机名进⾏ping通了,说明我们刚才添加的内容,在局域⽹内能进⾏DNS解析了,那么现在剩下的事⼉就是在其余
的Slave机器上进⾏相同的配置。然后进⾏测试。
1.4 所需软件
(1)JDK软件
JDK版本:
(2)Hadoop软件
Hadoop版本:hadoop-1.1.
2、SSH⽆密码验证配置
Hadoop运⾏过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停⽌各个DataNode上的各种守护进程的。这就必须在节点之间执⾏指令的时候是不需要输⼊密码的形式,故我们需要配置SSH运⽤⽆密码公钥认证的形式,这样NameNode使⽤SS
H⽆密码登录并启动DataName进程,同样原理,DataNode上也能使⽤SSH⽆密码登录到 NameNode。注意:如果你的Linux没有安装SSH,请⾸先安装SSH
Ubuntu下安装ssh:sudo apt-get install openssh-server
Fedora下安装ssh:yum install openssh-server
2.1 SSH基本原理和⽤法
1)SSH基本原理
SSH之所以能够保证安全,原因在于它采⽤了公钥加密。过程如下:
(1)远程主机收到⽤户的登录请求,把⾃⼰的公钥发给⽤户。
(2)⽤户使⽤这个公钥,将登录密码加密后,发送回来。
(3)远程主机⽤⾃⼰的私钥,解密登录密码,如果密码正确,就同意⽤户登录。
2)SSH基本⽤法
假如⽤户名为java,登录远程主机名为linux,如下命令即可:
$ ssh java@linux
SSH的默认端⼝是22,也就是说,你的登录请求会送进远程主机的22端⼝。使⽤p参数,可以修改这个端⼝,例如修改为88端⼝,命令如下:
$ ssh -p 88 java@linux
注意:如果出现错误提⽰:ssh: Could not resolve hostname linux: Name or service not known,则是因为linux主机未添加进本主机的Name Service中,故不能识别,需要在/etc/hosts⾥添加进该主机及对应的IP即可:
linux    192.168.1.107
2.2 配置Master⽆密码登录所有Salve
1)SSH⽆密码原理
Master(NameNode | JobTracker)作为客户端,要实现⽆密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上⽣成⼀个密钥对,包括⼀个公钥和⼀个私钥,⽽后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会⽣成⼀个随机数并⽤Master的公钥对随机数进⾏加密,并发送给Master。Master收到加密数之后再⽤私钥解密,并将解密数回传
给Slave,Slave确认解密数⽆误之后就允许Master进⾏连接了。这就是⼀个公钥认证过程,其间不需要⽤户⼿⼯输⼊密码。
2)Master机器上设置⽆密码登录
a. Master节点利⽤ssh-keygen命令⽣成⼀个⽆密码密钥对。
在Master节点上执⾏以下命令:
ssh-keygen –t rsa –P ''
运⾏后询问其保存路径时直接回车采⽤默认路径。⽣成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/home/⽤户名/.ssh"⽬录下。
查看"/home/⽤户名/"下是否有".ssh"⽂件夹,且".ssh"⽂件下是否有两个刚⽣产的⽆密码密钥对。
b. 接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key⾥⾯去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
查看下authorized_keys的权限,如果权限不对则利⽤如下命令设置该⽂件的权限:
chmod 600 authorized_keys
c. ⽤root⽤户登录修改SSH配置⽂件"/etc/ssh/sshd_config"的下列内容。
检查下⾯⼏⾏前⾯”#”注释是否取消掉:
RSAAuthentication yes # 启⽤ RSA 认证
PubkeyAuthentication yes # 启⽤公钥私钥配对认证⽅式
AuthorizedKeysFile  %h/.ssh/authorized_keys # 公钥⽂件路径
设置完之后记得重启SSH服务,才能使刚才设置有效。
退出root登录,使⽤普通⽤户验证是否设置成功。
从上图中得知⽆密码登录本级已经设置完毕,接下来的事⼉是把公钥复制所
有的Slave机器上。
注意:有时候在测试时可能会出现错误: Agent admitted failure to sign using the key.解决办法是:ssh-
add  ~/.ssh/id_rsa ,如下所⽰:d.使⽤ssh-copy-id命令将公钥传送到远程主机上(这⾥以Slave1.Hadoop为例)。
e. 测试是否⽆密码登录其它机器成功。
到此为⽌,我们经过5步已经实现了从"Master .Hadoop"到"Slave1.Hadoop"SSH ⽆密码登录,下⾯就是重复上⾯的步骤把剩余的两台(Slave2.Hadoop 和Slave3.Hadoop )Slave 服务器进⾏配置。这样,我们就完成了"配置Master ⽆密码登录所有的Slave 服务器"。
接下来配置所有Slave ⽆密码登录Master ,其和Master ⽆密码登录所有Slave 原理⼀样,就是把Slave 的公钥追加到Master 的".ssh"⽂件夹下的"authorized_keys"中,记得是追加(>>)。
注意:期间可能会出现⼀些问题如下:
(1)如果在ssh 连接时出现错误“ssh :connect to host port 22: Connection refused”,如下图所⽰:
则可能是因为远程登录的那台机器没有安装ssh 服务或安装了没有开启ssh 服务,下⾯到Slave3.Hadoop 主机进⾏测试:
为了⼀劳永逸,设置启动时开启服务:# systemctl enable sshd.service
(2)如果在⽤命令ssh-copy-id 时发现不到该命令“ssh-copy-id :Command not found ”,则可能是ssh 服务的版本太低的原因,⽐如若你的机器是Redhat 系统就可能该问题,解决办法是:⼿动复制本地的pubkey 内容到远程服务器,命令如下:
cat ~/.ssh/id_rsa.pub | ssh hadoop@Master.Hadoop 'cat >> ~/.ssh/authorized_keys'
该命令等价于下⾯两个命令:
①在本地机器上执⾏:scp ~/.ssh/id_rsa.pub hadoop@Master.Hadoop:/~
②到远程机器上执⾏:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
3、Java 环境安装
所有的机器上都要安装JDK ,现在就先在Master 服务器安装,然后其他服务器按照步骤重复进⾏即可。安装JDK 以及配置环境变量,需要以"root"的⾝份进⾏。
3.1 安装JDK
⾸先⽤root ⾝份登录"Master.Hadoop"后在"/usr"下创建"java"⽂件夹,再将""复
制到"/usr/java"⽂件夹中,然后解压即可。查看"/usr/java"下⾯会发现多了⼀个名为"jdk1.7.0_25"⽂件夹,说明我们的JDK 安装结束,删除""⽂件,进⼊下⼀个"配置环境变量"环节。
3.2 配置环境变量
(1)编辑"/etc/profile"⽂件
编辑"/etc/profile"⽂件,在后⾯添加Java 的"JAVA_HOME"、"CLASSPATH"以及"PATH"内容如下:
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export JRE_HOME=/usr/java/jdk1.7.0_25/jre
export CLASSPATH=.:CLASSPATH :JAVA_HOME/lib:$JRE_HOME/lib
export PATH=PATH :JAVA_HOME/bin:$JRE_HOME/bin
或者
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export CLASSPATH=.:CLASSPATH :JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=PATH :JAVA_HOME/bin:$JAVA_HOME/jre/bin
以上两种意思⼀样,那么我们就选择第1种来进⾏设置。
(2)使配置⽣效
保存并退出,执⾏下⾯命令使其配置⽴即⽣效。
source /etc/profile 或 . /etc/profile
3.3 验证安装成功
配置完毕并⽣效后,⽤下⾯命令判断是否成功。
java -version
从上图中得知,我们确定JDK 已经安装成功。
3.4 安装剩余机器
这时⽤普通⽤户hadoop 通过scp 命令格式把"/usr/java/"⽂件复制到其他Slave 上⾯,剩下的事⼉就是在其余的Slave 服务器上按照上图的步骤配置环境变量和测试是否安装成功,这⾥以Slave1.Master 为例:
scp -r /usr/java seed@Slave1.Master:/usr/
注意:有的机器库函数版本较低,可能安装不了⾼版本的JDK ,⽐如有些Redhat9,此时不可以选择较低版本的JDK 进⾏安装,因为所有集中的JDK 版本必须相同(经过测试),有两种⽅法可解决:⼀是放弃该机器,选⽤另⼀台能装该版本的JDK 的机⼦;⼆是选择低版本的JDK ,在所有机器上重新安装。
4、Hadoop 集安装
所有的机器上都要安装hadoop ,现在就先在Master 服务器安装,然后其他服务器按照步骤重复进⾏即可。安装和配置hadoop 需要以"root"的⾝份进⾏。
4.1 安装hadoop
CLASSPAT H :PAT H :CLASSPAT H :PAT H :
⾸先⽤root⽤户登录"Master.Hadoop"机器,将下载的"hadoop-1.1."复制到/usr⽬录下。然后进⼊"/usr"⽬录下,⽤下⾯命令把"hadoop-1.1."进⾏解压,并将其重命名为"hadoop",把该⽂件夹的读权限分配给普通⽤户hadoop,然后删除"hadoop-
1.0."安装包。
cd /usr
tar –xzvf hadoop-1.1.
mv hadoop-1.1.2 hadoop
chown –R hadoop:hadoop hadoop #将⽂件夹"hadoop"读权限分配给hadoop普通⽤户
rm -rf hadoop-1.1.
最后在"/usr/hadoop"下⾯创建tmp⽂件夹,并把Hadoop的安装路径添加到"/etc/profile"中,修改"/etc/profile"⽂件,将以下语句添加到末尾,并使其⽣效(. /etc/profile):
# set hadoop path
export HADOOP_HOME=/usr/hadoop
PATH:
export PATH=PATH:HADOOP_HOME/bin
4.2 配置hadoop
(1)配置hadoop-env.sh
该"hadoop-env.sh"⽂件位于"/usr/hadoop/conf"⽬录下。
在⽂件中修改下⾯内容:
export JAVA_HOME=/usr/java/jdk1.7.0_25
Hadoop配置⽂件在conf⽬录下,之前的版本的配置⽂件主要是l和l。由于Hadoop发展迅速,代码量急剧增加,代码开发分为了core,hdfs和map/reduce三部分,配置⽂件也被分成了三个l、l、l。l和l是站在 HDFS⾓度上配置⽂件;l和l是站在MapReduce⾓度上配置⽂件。
(2)配置l⽂件
修改Hadoop核⼼配置⽂件l,这⾥配置的是HDFS master(即namenode)的地址和端⼝号。
<configuration>
<property>
<name&p.dir</name>
<value>/usr/hadoop/tmp</value>
(备注:请先在 /usr/hadoop ⽬录下建⽴ tmp ⽂件夹)
<description>A base for other temporary directories.</description>
</property>
<!-- file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.1.141:9000</value>
</property>
</configuration>
备注:如没有配置p.dir参数,此时系统默认的临时⽬录为:/tmp/hadoo-hadoop。⽽这个⽬录在每次重启后都会被删掉,必须重新执⾏format才⾏,否则会出错。
(3)配置l⽂件
修改Hadoop中HDFS的配置,配置的备份⽅式默认为3。
<configuration>
<property>
<name&plication</name>
<value>1</value>
(备注:replication 是数据副本数量,默认为3,salve少于3台就会报错)
</property>
<configuration>
(4)配置l⽂件
修改Hadoop中MapReduce的配置⽂件,配置的是JobTracker的地址和端⼝。
<configuration>
<property>
<name>acker</name>
</property>
</configuration>
(5)配置masters⽂件
有两种⽅案:
(1)第⼀种
修改localhost为Master.Hadoop
(2)第⼆种
去掉"localhost",加⼊Master机器的IP:192.168.1.141
为保险起见,启⽤第⼆种,因为万⼀忘记配置"/etc/hosts"局域⽹的DNS失效,这样就会出现意想不到的错误,但是⼀旦IP配对,⽹络畅通,就能通过IP到相应主机。
(6)配置slaves⽂件(Master主机特有)
有两种⽅案:
(1)第⼀种
去掉"localhost",每⾏添加⼀个主机名,把剩余的Slave主机名都填上。
例如:添加形式如下:
Slave1.Hadoop
Slave2.Hadoop
(2)第⼆种
去掉"localhost",加⼊集中所有Slave机器的IP,也是每⾏⼀个。
例如:添加形式如下
192.168.1.142
192.168.1.137
原因和添加"masters"⽂件⼀样,选择第⼆种⽅式。
现在在Master机器上的Hadoop配置就结束了,剩下的就是配置Slave机器上的Hadoop。
最简单的⽅法是将Master上配置好的hadoop所在⽂件夹"/usr/hadoop"复制到所有的Slave的"/usr"⽬录下(实际上Slave机器上的slavers⽂件是不必要的,复制了也没问题)。⽤下⾯命令格式进⾏。(备注:此时⽤户可以为普通⽤户也可以为root)
scp -r /usr/hadoop root@服务器IP:/usr/
例如:从"Master.Hadoop"到"Slave1.Hadoop"复制配置Hadoop的⽂件。
scp -r /usr/hadoop root@Slave1.Hadoop:/usr/
以root⽤户进⾏复制,当然不管是⽤户root还是普通⽤户,虽然Master机器上的"/usr/hadoop"⽂件夹⽤户hadoop有权限,但是Slave1上的hadoop⽤户却没有"/usr"权限,所以没有创建⽂件夹的权限。所以⽆论是哪个⽤户进⾏拷贝,右⾯都是"root@机器IP"格式。因为我们只是建⽴起了普通⽤户的SSH⽆密码连接,所以⽤root进⾏"scp"时,扔提⽰让你输⼊"Slave1.Hadoop" 服务器⽤户root的密码。
查看"Slave1.Hadoop"服务器的"/usr"⽬录下是否已经存在"hadoop"⽂件夹,确认已经复制成功。查看结果如下:
从上图中知道,hadoop⽂件夹确实已经复制了,但是我们发现hadoop权限是root,所以我们现在要给"Slave1.Hadoop"服务器上的⽤
户hadoop添加对"/usr/hadoop"读权限。
以root⽤户登录"Slave1.Hadoop",执⾏下⾯命令。
chown -R hadoop:hadoop(⽤户名:⽤户组) hadoop(⽂件夹)
接着在"Slave1 .Hadoop"上修改"/etc/profile"⽂件,将以下语句添加到末尾,并使其有效(source /etc/profile):
# set hadoop environment
export HADOOP_HOME=/usr/hadoop
PATH:
export PATH=PATH:HADOOP_HOME/bin
如果不知道怎么设置,可以查看前⾯"Master.Hadoop"机器的"/etc/profile"⽂件的配置,到此为⽌在⼀台Slave机器上的Hadoop配置就结束了。剩下的事⼉就是照葫芦画瓢把剩余的⼏台Slave机器进⾏部署Hadoop。
4.3 启动及验证
(1)格式化HDFS⽂件系统
在"Master.Hadoop"上使⽤普通⽤户hadoop进⾏操作。(备注:只需⼀次,下次启动不再需要格式化,只需 start-all.sh)
hadoop namenode -format
从上图中知道我们已经成功格式化了,但是美中不⾜就是出现了⼀个警告,从⽹上得知这个警告并不影响hadoop执⾏,但是也有办法解决,详情看后⾯的"常见问题FAQ"。
(2)启动hadoop
在启动前关闭集中所有机器的防⽕墙,不然会出现datanode开后⼜⾃动关闭。使⽤下⾯命令启动。
start-all.sh
可以通过以下启动⽇志看出,⾸先启动n a m e n o d e 接着启动datanode1,datanode2,…,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,tasktracker2,…。
启动 hadoop成功后,在 Master 中的 tmp ⽂件夹中⽣成了 dfs ⽂件夹,在Slave 中的 tmp ⽂件夹中均⽣成了 dfs ⽂件夹和 mapred ⽂件夹。(3)验证hadoop
(1)验证⽅法⼀:⽤"jps"命令
在Master上⽤ java⾃带的⼩⼯具jps查看进程。
在Slave2上⽤jps查看进程。
如果在查看Slave机器中发现"DataNode"和"TaskTracker"没有起来时,先查看⼀下⽇志的,如果是"namespaceID"不⼀致问题,采⽤"常见问题FAQ6.2"进⾏解决,如果是"No route to host"问题,采⽤"常见问题FAQ6.3"进⾏解决。
(2)验证⽅式⼆:⽤"hadoop dfsadmin -report"
⽤这个命令可以查看Hadoop集的状态。
4.4 ⽹页查看集
(1)访问"192.168.1.141:50030"
5、常见问题FAQ
5.1 关于 Warning: $HADOOP_HOME is deprecated.
hadoop安装完之后敲⼊hadoop命令时,⽼是提⽰这个警告:
Warning: $HADOOP_HOME is deprecated.
经查hadoop-1.1.2/bin/hadoop脚本和"hadoop-config.sh"脚本,发现脚本中对HADOOP_HOME的环境变量设置做了判断,其实根本不需要设置HADOOP_HOME环境变量。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。