目录
一 什么是完全分布式
之前3篇博客搭建的环境都是伪分布式的环境,就是说除了我自己的电脑(win10)外,只有一台服务器(Linux),这在真正的生产环境下是不存在的,真正的生产环境是上百台甚至上千台服务器(Linux),那么上千台服务器之间如何工作呢?一个Hadoop如何在上千台服务器上进行工作呢?像这样由Hadoop统一管理服务器的形式叫做完全分布式。想要搭建这样的一个分布式框架,至少需要3台服务器,我也仅以3台服务器为例。
二 准备服务器
- 准备三台安装Linux的服务器,可以在VMware中直接克隆,要求:关闭防火墙,静态ip,修改主机名称,这些在前面的博客中都详细介绍操作步骤。
- 安装JDK,配置环境变量,安装Hadoop,配置Hadoop环境变量,这里注意每一台服务器上都现需要安装JDK和Hadoop。
这里还是总结一下:
- 关闭防火墙:chkconfig iptables off
- 设置静态IP:vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改IP地址
- 修改主机名称:vim /etc/sysconfig/network
三 集群分发脚本
什么叫集群分发脚本呢?是这样,比方说上面准备虚拟机的时候需要安装Hadoop,需要拷贝安装包等,三台服务器还比较方便,如果是1000台服务器呢?可能一两天才能把Hadoop安装好,集群分发脚本就是在一台服务器上安装好了之后直接使用脚本给另外999台服务器发过去,方便了很多。
3.1 scp(secure copy)安全拷贝
- 使用scp可以实现服务器和服务器之间的安全拷贝
- 基本语法:scp -r(递归)$pdir/$fname(需要拷贝的文件夹或者文件名称)$user@hadoop102:$pdir/$fname(目的用户的主机名称和目的地址)
举例:将hadoop103上的文件/home/wanglei/people下的文件拷贝到hadoop104上
温馨提示:当拷贝配置文件时,比如/etc/profile,需要source /etc/profile
3.2 rsync远程同步
- rsync与scp表达的功能相同,但是它比scp要快,因为rsync只复制不同的文件,而scp把所有文件都复制过去
- 基本语法:rsync -rvl $pdir/$fname(需要拷贝的文件夹或者文件名称)$user@hadoop102:$pdir/$fname
举例:将hadoop103上的文件/home/wanglei/animal下的文件拷贝到hadoop104上
3.3 集群分发脚本
上述两种命令也仅仅只能让两个服务器之间通信,如何让多个服务器之间通信呢?这就需要写一个脚本了,下面附上脚本的代码再做解释。
#!/bin/bash
paraCount=$#
if [ $paraCount -eq 0 ]
then
echo "没有输入参数"
exit
fi
p1=$1
fname=$(basename $p1)
echo "$fname"
pdir=$(cd -P $(dirname $p1);pwd)
echo "$pdir"
user=$(whoami)
echo "$user"
for ((host=104;host<105;host++))
do
echo "$host"
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/
echo "$pdir/$fname $user@hadoop$host:$pdir/"
done
-
#!/bin/bash:shell脚本的头文件标识,可以理解为c语言的头文件一样,不用理会,就是这个格式
-
paraCount=$#:$#表示获取输入参数的个数,$0表示命令自己本身,$1表示输入的第一个参数,$2表示输入的第二个参数,以此类推,但是第十个参数以上就是${10}了;$*表示命令行所有的参数并把他们当作一个整体,$@表示命令行所有的参数,但是他们是分开的。
-
if [ $paraCount -eq 0 ]:if条件语句,注意中括号中的条件与中括号两边都有空格。
-
fname=$(basename $p1):首先$()中是linux语句表示将这条语句的执行结果赋给某个值,其次basename表示去除/前面的所有路径,只保留最后一个
-
pdir=$(cd -P $(dirname $p1); pwd):dirname与basename恰恰相反,它的作用是保留最后一个/前的所有路径,cd -P是获得物理地址,也就是说从根目录下来的地址。
-
user=$(whoami):whoami是获取当前用户名称,并把这个结果给user
-
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/:根据路径复制
具体用法:使用之前,记得给执行权限 chmod 777 xsync1
xsync1 /home/wanglei/animal
四 集群规划
| hadoop102 | hadoop103 | hadoop104 |
HDFS
| NameNode DataNode |
DataNode | SecondaryNameNode DataNode |
YARN |
NodeManager | ResourceManager NodeManager |
NodeManager |
4.1 规划思想
见上表格,Hadoop集群由NameNode、DataNode、SecondaryNameNode和ResourceManager、NodeManager组成,如何规划他们呢?上面的表格,做一下解释:只需要记住一点NameNode和ResourceManager不能在同一台服务器,因为这两个组件都非常消耗资源。
4.2 具体配置
所有机器:core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
hdfs-site.xml设置2nn的位置
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
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>hadoop103</value>
</property>
mapred-site.xml
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置结束后直接用xsync分发整个hadoop包即可
4.3 ssh免密登陆
为什么需要ssh免密登陆呢?是为了方便群起集群,上面虽然将集群规划好了,但是还是要到相应的服务器上启动相应的服务,不方便,使用ssh免密登陆就可以在一台机器上启动所有服务。
步骤:
- 生成公钥的密钥:ssh-keygen -t rsa
- 将公钥拷贝至其他机器:ssh-copy-id hadoop102;ssh-copy-id hadoop103;ssh-copy-id hadoop104
- 配置slaves文件:vim /etc/hadoop/slaves 在文件中删除localhost,添加hadoop102 hadoop103 hadoop104,并群发
- 启动Hadoop,因为Hadoop分为hdfs和yarn,所以启动也是启动这两个部分
- NameNode在102上,去102启动hdfs:sbin/start-dfs.sh
- ResourceManager在103上,去103上启动yarn:sbin/start-yarn.sh
这样只需要启动一次hdfs和一次yarn即可。很方便。