集群分发脚本
注意分布式集群操作一定会用到ssh,所以要开启ssh服务。并且要网络能够互相ping通
scp(secure copy)安全拷贝
这部分是分发脚本的基础介绍。如果只是想快速搭建,这部分可跳过。
定义
可以实现服务器于服务器之间的数据拷贝。(一个服务器中的数据拷贝给另一个服务器)
基本语法
1
2
3
4
5scp -r $pdir/$fname $user@$host:$pdir/$fname
命令名 递归方式执行 被拷贝的文件的用户名@主机,文件目录/文件名 接收的用户名@主机:存放目录/存放文件名
如果是要拉取资源,也就是被拷贝文件是对方服务器,就将 $user@$host: 写在对象资源路径前:
scp -r $user@$host:$pdir/$fname $pdir/$fname演练1
将hadoop103的家目录下的a1.log(在家目录下新建一个:
touch ~/a1.log
)拷贝到hadoop105的家目录下被拷贝的文件:
/home/hadoop103/a1.log
拷贝目标:
hadoop@192.168.64.105:/home/hadoop105/a1_copy.log
1
scp -r /home/hadoop103/a1.log hadoop105@192.168.64.105:/home/hadoop105/a1_copy.log
注意,执行之后回询问是否继续连接,输入yes后,回要求输入对方的密码,过程如下:
去hadoop105检查一下:
可以看到已经移动过去了。
演练2
演练一是发送的感觉,现在试试拉取(a1_copy.log),本地存储为a1.log
把hadoop103下的a1.log删除掉
rm ~/a1.log
在hadoop103下:
数据来源的地方写的
hadoop105@192.168.10.105:/home/hadoop105/a1_copy.log
1
scp -r hadoop105@192.168.64.105:/home/hadoop105/a1_copy.log /home/hadoop103/a1.log
如图即为成功。
rsync远程同步指令
这部分也是分发脚本的基础介绍。如果只是想快速搭建,这部分可跳过。
定义
主要侧重在同步,意思是原本就有一部分数据,但是一方做出了变动,想要同步,这时候不需要再完全复制一份。
rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。
基本语法
1
2
3
4
5
6
7
8rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令名 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
如果是拷贝来源是对方,就给对方加 $user@$host: 就好了,(拉取资源时):
rsync -av $user@$host:$pdir/$fname $pdir/$fname
-a 归档拷贝
-v 显示复制过程演练
同步
/home/hadoop103
,只有hadoop103中才有a1.log文件(在hadoop104下操作)1
rsync -a hadoop103@192.168.64.103:/home/hadoop103 /home/hadoop104
由于有-v命令回显示很多内容(显示很多内容不一定时全都拷贝了,只是显示出来了)。
注意看输入的命令的路径是
/home/hadoop103
,因为a1.log在/home/hadoop103
下。如果在/home
下,会把对方整个home
拉取拷贝到/home/hadoop104
下,这个时候的结果实际上就是:/home/hadoop104/hadoop103
就不是同步资源了,就完全是新拷贝了一份资源。
配置SSH免密登录
我们提到了集群会经常用ssh,每次使用都要使用密码会很麻烦,上面可以看出来的。下面就介绍配置免密登录
这个是为之后的集群分发脚本打基础,有了这个会方便一些。
原理和终端连接Ubuntu类似,可参看。
在hadoop103下操作:
只要执行过ssh命令就会多出来一个.ssh目录,现在cd到.ssh目录,多产生一个公钥和一个密钥。
1
ssh-keygen -t rsa
按三次回车即可:
在
~/.ssh
目录下会多生成两个文件,一个id_rsa是密钥,id_rsa.pub就是公钥。
然后将公钥拷贝到服务器:
1
cat ./id_rsa.pub >> ./authorized_keys
再检查一下登录本地是否需要密码:
1
ssh localhost
这样是自己登录时的免密登录。
之后需要配置其他服务器登录自己服务器也免密登录:
(当前操作的服务器是hadoop103嘛,以传递给hadoop104为例):
1
ssh-copy-id hadoop104@192.168.10.104
然后检查一下登录hadoop104试试需不需要密码:
1
ssh hadoop104@192.168.64.104
如果不需要设置密码就算设置好了。
同理,将hadoop103的传递给hadoop104、hadoop105
总结一下就是三条命令
1 | ssh-keygen -t rsa |
配置自己的ssh免密登录:先用cat id_rsa.pub
获取到公钥,然后再vim authorized_keys
在文件中添加新的公钥,之后保存退出。
然后在其他三台服务器上同样操作(每台服务器都要产生公钥在拷贝给另外两台)。(不过可以提前配置一下端口映射,先看下一段,配置之后操作简单很多)。
配置服务器别名
和终端连接Ubuntu类似,同样的道理来配置服务器别名:
用vim编写:/etc/hosts
:
1 | sudo vim /etc/hosts |
下如下内容:
1 | # hadoop |
如图:
这就是把第一台的弄好了,接下来换到其他两台服务器,直接复制这段内容即可。
到目前,登录hadoop104的命令从原来的:ssh hadoop104@192.168.64.104
变成了ssh hadoop104@hadoop104
.
接着配置服务器别名(还是先在hadoop103下操作):
1 | touch ~/.ssh/config # 在~/.ssh目录下创建文件config |
写下内容:
1 | Host hadoop103 |
同样,在其他三台服务器上进行同样操作。
这样完成后,上一步的ssh hadoop104@hadoop104
也变成了:ssh hadoop104
。更简洁了,当然,如果了愿意,也可以配置得更短,更简单。
OK,现在可以继续去弄一下免密登录啦,会方便很多啦。例如上面知识配置了hadoop103免密登录hadoop104,现在配置hadoop103免密登录hadoop105只需要:ssh-copy-id hadoop105
正式编写集群分发脚本
脚本内容其实就是封装了一下rsync
命令,也不复杂。
需求
循环赋值文件到所有节点的相同目录下
分析和准备
想要全局使用就要放在全局目录下(配置了PATH的目录下),配置了PATH的目录:
为了安全把脚本写在
/home/hadoop103/bin
,新建这个目录,然后配置环境变量:1
mkdir /home/hadoop103/bin
然后配置环境变量:
1
vim ~/.bashrc
写入内容:
1
export PATH=$PATH:/home/hadoop103/bin
然后刷新:
source ~/.bashrc
检验一下,输入
echo $PATH
可以看到新的环境变量已经添加到原本到系统变量后了。
在
/home/hadoop103/bin
下新建脚本,写脚本1
2touch ~/xsync
vim ~/xsync写入脚本内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#1. 判断参数个数,如果小于1,就直接退出
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
#for host in hadoop102 hadoop103 hadoop104 这种写法要求配置了对应名称的IP地址,没配置,就直接写IP地址
# 本来主机名就要转化成IP地址的,所以直接用IP地址也没问题
for host in hadoop103 hadoop104 hadoop105
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在,存在是核心代码
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
#7. 直接跳转到对应host去(相当于100跳转到102操作102),跳转过去执行引号例的脚本命令
ssh $host "mkdir -p $pdir"
#8. 执行同步命令
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done给脚本添加可执行权限:
1
chmod +x xsync
测试使用,把hadoop目录给分发过去,这样hadoop也就出现在其他两台服务器上了
1
xsync /usr/local/hadoop
注意:如果用了 sudo,那么 xsync 一定要给它的路径补全:
sudo ./bin/xsync /usr/local/hadoop
我在分发到时候遇到了问题,就是说权限不允许,解决办法:
在其他两台服务器:
1
2
3sudo mkdir /usr/local/hadoop
sudo chown hadoop104 hadoop # hadoop105 下写 hadoop105
sudo chgrp hadoop104 hadoop # hadoop105 下写 hadoop105然后再执行脚本分发命令,就分发过去了。
到这里集群分发脚本就写好了。在其他两台服务上也如此操作。
注意集群分发脚本的使用就是直接分发这个目录,最好是路径是都有的。
如果:xsync /home/hadoop103/bin
不是把bin给其他两个服务器,而是在其他两个服务器的/home
目录下新建:/hadoop103/bin
。和想的不一样哦,不是在/home/hadoop104
或/home/hadoop105
目录下新建bin
目录。
可以继续看搭建Hadoop集群啦