前面咱们讲到了hadoop拥有3种运行模式,搭建了最简答的本地运行模式并在其上运行了两个简单案例,以后搭建了伪分布模式,并在其上运行了wordcount案例。本章节咱们学习彻底分布式的模式。顾名思义,该模式使用多台机器实现分布式。node
从本章节你能够学习到:shell
咱们准备3台机器(分布式最小需求),其主机文件配置以下:apache
192.168.102.133 h133 192.168.102.134 h134 192.168.102.135 h135
也就是说,咱们准备的3台机器,主机名以h开头,13三、134以及135分别是他们的v4地址的最后一段,方便区别。centos
主机配置文件位于/etc/hosts,修改主机名使用命令
hostname h133
bash
3台机器都关闭防火墙
systemctl stop firewalld
。服务器
按本地运行模式的安装方式hadoop安装在3台机器上,请参考本教程的2.运行环境搭建
章节。ssh
若是您使用的是xshell进行各服务器的链接,最好使用
工具-发送键到全部会话
功能,一次性配置三台主机。分布式
如今咱们已经在3台机器上(h13三、h134以及h135)。在使用scp的命令过程当中,你会发现每次都要输入节点的帐户密码才行,若是你安装了ssh(必装),每次输入ssh访问其余机器的时候,也须要输入密码。这不只让咱们操做起来很是麻烦,并且hadoop的一些集成脚本(如start-dfs.sh
等)没法直接运行,须要咱们配置ssh无密码登陆。工具
一、进入用户的home目录oop
# cd ~
cd ~
进入当前用户的用户目录。root用户为/root,其余用户的为/home/{$username}
二、进入.ssh
目录,在该目录下生成秘钥对
# ssh-keygen -t rsa
输入该指令后连续3次回车,即关于秘钥对的设置都使用默认值。
三、复制秘钥对的公钥信息到各台服务器上,包括本身
# ssh-copy-id h133 # ssh-copy-id h134 # ssh-copy-id h135
注意不要漏掉主机自己的配置。
如今咱们能够从h133上直接经过命令'ssh hostname'
无秘钥登陆到指定的主机上了。
通常状况下,咱们只需针对一台机器作此配置就能够了。可是因为咱们还会在另一台机器上就行调度,所以,还须要在h134主机上作此配置。也就说,3台机器里面,咱们选定两台配置无秘钥登陆。h135上的操做流程同刚才的,继续执行一遍便可。
.ssh目录下默认没有文件,当咱们第一次使用远程登陆命令以后会生成一个名为
known_hosts
的文件,记录访问的服务器信息;当咱们执行生成秘钥对命令以后,会生成公私钥两个文件id_rsa
和id_rsa.pub
;当当前服务器接受了别的服务器的ssh-copy-id
即被复制了公钥以后,会新生成文件authorized_keys
,该文件记录认证了的主机及其秘钥对的公钥信息。
为了咱们接下来方便进行一些操做,咱们编写几个辅助脚本辅助操做。
以前咱们进行远程文件调用的时候使用的是scp命令,但要注意,scp命令顾名思义是security copy的缩写,若目标拥有相同的文件,则会覆盖更新。而rsync则表明同步的意思,若文件没有修改,则不会复制,如有修改,则会更新。从这个角度上来看rsync相对比较快速一些。具体其余的差异,可能须要具体研究。
一、安装rsync命令工具
# yum install rsync -y
最小化安装的centos通常没有配备这个工具,须要咱们从镜像仓库拉取安装。
二、测试远程复制
# rsync -rvl test.txt root@h134:~
了解了rsync以后。
接下来咱们编写一个脚本,内部调用rsync命令帮咱们完成一个这样的操做:咱们只需执行命令
# xsync /目录/.../文件
就能够将指定的路径同步到其余的服务器上,这样就省去咱们打太多命令的麻烦。在/usr/local/bin
下建立脚本文件xsync,写入以下内容:
#!/bin/bash # 1. get param num,if 0 exit. pcount=$# if((pcount==0)); then echo no args; exit; fi # 2. get file name. p1=$1 fname=`basename $p1` echo fname=$fname # 3. get parent dir absolute path. pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir # 4. get user name. user=`whoami` # 5. loop all hosts to run command 'rsync -rvl'. for((host=133; host<=135; host++)); do echo $pdir/$fname $user@h$host:$pdir echo --------------- h$host ---------------- rsync -rvl $pdir/$fname $user@h$host:$pdir done
注意最后的循环部分,是用
h
加上133到135拼接目标主机名(拼接结果依次为h133 h134 h135)进行循环处理的,若是您的环境不一样,请修改脚本此处的具体内容。
三、修改脚本运行权限
chmod 777 /usr/local/bin
777是一种很暴力的受权方式,相关受权的知识推荐书籍《Linux从入门到放弃 鸟哥版》。
四、执行脚本进行测试,在任何位置建立一个文件test.txt并写入内容,使用命令
xsync test.txt
显然,其余的两台服务器也会在相同的位置复制生成该文件。
根据前面一个脚本的经验,咱们不妨在编写一个脚本,能够执行
相似xshell这类工具其实也有提供咱们多端同时输入的功能,这里的脚本比较简单,参数有关路径的必须填写绝对路径,不然出错。另外,能操做的服务器只涉及集群服务器,而不像xshell这类客户端同样能够自行配置。
一、在/usr/local/bin
下建立xcall文件,并写入以下内容
#!/bin/bash # 1.get parameter,no param wull be exit. pcount=$# if((pcount==0));then echo no args; exit; fi # 2.print localhost string. echo -------------localhost---------- # 3.run command for each host. for((host=133; host<=135; host++)); do echo ----------h$host--------- ssh h$host $@ done
能够看到该脚本的执行原理是
ssh h1xx command
的方式执行的,也就是说,任何命令都是登陆到目标主机以后在执行的,这就会致使目录的不一致问题,所以,咱们须要提供的路径信息必须是绝对路径。
二、暴力受权:
# chmod 777 xcall
三、测试脚本
[root@localhost bin]# xcall ls /opt/module/ -------------localhost---------- ----------h133--------- hadoop-2.7.2 jdk1.8.0_131 ----------h134--------- hadoop-2.7.2 jdk1.8.0_131 ----------h135--------- hadoop-2.7.2
接下来咱们规划一下集群的节点分配以及配置文件的设置。
咱们按照下表所列的节点分配来规划咱们的集群 ||DataNode|NameNode|SecondaryNameNode|NodeManager|ResourceManager| |:-:|:-:|:-:|:-:|:-:|:-:| |h133|√|√||√|| |h134|√|||√|√| |h135|√||√|√||
也就是说,三台机都是DataNode节点,h133用做名称节点,h135用做辅助名称节点,h133和h135用做节点管理节点,h134用做资源管理节点。
NodeNode、SecondaryNameNode以及ResourceManager是比较耗费服务器资源的,所以咱们将他们分别放在三台服务器上。
选定服务器h133,在其上进行文件配置,以后咱们再从h133上将配置文件推送到其余的集群服务就能够实现配置文件的同步了。
全部的配置文件都位于/opt/module/hadoop-2.7.2/etc/hadoop/下。如下配置是针对个人环境进行配置的,注意一些配置的值须要和你的环境保持对应。
一、core-site.xml
:
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://h133:8020</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
二、配置HDFS
咱们先来配置HDFS组件相关的配置信息。
(1)hadoop-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_131
(2)hdfs-site.xml
:
<configuration> <!-- 指定数据节点存储副本数,默认是3,所以可不配置--> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定SecondaryNameNode地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>h135:50090</value> </property> </configuration>
(3)配置slaves服务节点,也就是数据节点(datanode)的主机名称,咱们前面提到过,要将全部机器都做为datanode。修改slaves
文件,加入以下内容:
h133 h134 h135
slaves文件的默认内容为localhost,咱们修改其为集群全部节点。salve文件一样位于
/opt/module/hadoop-2.7.2/etc/hadoop
下。
四、配置YARN
接下来咱们接着配置YARN组件相关的配置信息。
(1)yarn-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_131
(2)yarn-site.xml
:
<!-- reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>h134</value> </property>
五、配置MapReduce
最后咱们配置MapReduce组件
(1)mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_131
(2)使用mapred-site.xml.tempalte模板,修改其名字为:mapred-site.xml
,添加以下配置:
<!-- 指定mr运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
接下来,咱们的配置工做就在一台机器上完成了。这样的操做咱们还须要从其余集群机器上再来一次,不过没必要那么麻烦,直接使用咱们前面的xsync脚本就能够了。
在此以前,请再一次检查你的配置文件是否有遗漏、勘误——这是个细心活。
六、分发配置文件 来到hadoop配置文件上一级,将hadoop文件夹总体分发到集群的全部节点便可完成配置文件的同步。
# cd /opt/module/hadoop-2.7.2/etc/ # xsync hadoop
执行命令后您能够在其余服务器上查看配置文件是否成功同步。
前面咱们启动集群的时候是一个节点一个节点的启动的,如今咱们使用集成脚原本启动集群。
格式化NameNode的时候请在namenode所在的节点上执行操做。
若是NameNode和ResourceManager不在同一台机器上,例如咱们如今的例子。不能在NameNode上启动Yarn,应该在ResourceManager指定的服务器上启动Yarn。
一、到namenode所在服务器,即h133上格式化NameNode。
[h133]# hdfs namenode -format
二、h133上启动dfs组件
(1)调用dfs集成脚本启动
[h133]# start-dfs.sh
(2)查看节点启动状况
[h133]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h133--------- 2227 NameNode 2347 DataNode 2575 Jps ----------h134--------- 2513 DataNode 2607 Jps ----------h135--------- 2168 Jps 2009 DataNode 2073 SecondaryNameNode
若是你的环境输出和这个不一致,例如h133上没有发现有NM DN节点,则说明有问题,请查看本身哪一步出现问题了。
四、h134上启动yarn组件
注意,启动dfs组件在h133。而如今,咱们切换到h134,即ResourceManager所在的服务器上执行yarn组件的启动。
(1)调用yarn集成脚本启动组件
[h134] start-yarn.sh
(2)查看启动状况
[h134 ]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h133--------- 2721 Jps 2227 NameNode 2615 NodeManager 2347 DataNode ----------h134--------- 2656 ResourceManager 2513 DataNode 2754 NodeManager 3055 Jps ----------h135--------- 2320 Jps 2211 NodeManager 2009 DataNode 2073 SecondaryNameNode
若是您的进程开启状况和这个一致,恭喜你,集群搭建成功了!。
若是中间过程出错了,要回退到初始状态,只须要中止全部的集群节点
sbin/stop-xxx.sh
,而后删除各服务器的{HADOOP_HOME}/data
以及{HADOOP_HOME}/logs
以后。盘查完问题在从头来过。