编写集群分发脚本xsync:
1. scp(secure copy):安全拷贝
①. scp定义:scp可以实现服务器与服务器之间的数据拷贝(from server1 to server2);
②. 基本语法:
scp -r $pdir/$fname $user@host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
③. 案例:
a. 在Hadoop102、Hadoop103、Hadoop104上都已创建好的opt/module//opt/software两个目录,并且目录名修改为xiaobai:xiaobai:
[xiaobai@hadoop102 ~]$ sudo chown xiaobai:xiaobai -R /opt/module
b. 在hadoop102上,将hadoop102中的/opt/module/jdk1.8.0_144
目录拷贝到hadoop103上:
[xiaobai@hadoop102 ~]$ scp -r /opt/module/jdk1.8.0_144 xiaobai@hadoop103:/opt/module/
c. 在hadoop103上,将hadoop102中/opt/module/hadoop-3.2.2
目录拷贝到hadoop103上:
[xiaobai@hadoop103 ~]$ scp -r xiaobai@hadoop102:/opt/module/hadoop-3.2.2 /opt/module/
tips:
1.在hadoop102上连接hadoop103要输入hadoop103的用户名及主机名称和对应的地址:xiaobai@hadoop103: /地址;
同样,在hadoop103上连接hadoop102也要输入hadoop102的用户名及主机名称和对应的地址:xiaobai@hadoop102: /地址;
2.在hadoop103上也可以将hadoop102的文件拷贝到hadoop104上(由于/opt/module下只有jdk/hadoop,所以可用 “ * ” 一次性复制,要复制单个文件也可补全文件名):
[xiaobai@hadoop103 ~]$ scp -r xiaobai@hadoop102:/opt/module/* xiaobai@hadoop104:/opt/module/
xiaobai@hadoop102's password:
The authenticity of host 'hadoop104 (192.168.10.104)' can't be established.
ECDSA key fingerprint is SHA256:97X64xBWvWbC3aB39376dykfVlJ1/Eq6kNFSObPp7NQ.
ECDSA key fingerprint is MD5:98:00:9e:9c:15:7a:7c:20:f8:a4:32:97:af:c2:1d:25.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop104,192.168.10.104' (ECDSA) to the list of known hosts.
xiaobai@hadoop104's password:
2. rsync远程同步工具:
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别: 用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
①. 基本语法:
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数说明:
选项 功能
-a 归档拷贝
-v 显示复制过程
②. 案例:
a. 删除hadoop103中/opt/module/hadoop-3.2.2/wcinput:
[xiaobai@hadoop103 hadoop-3.2.2]$ rm -rf wcinput/ wcoutput/
b. 同步hadoop102中的/opt/module/hadoop-3.2.2到hadoop103中(只同步了wcinput/ wcoutput/
):
[xiaobai@hadoop102 module]$ rsync -av hadoop-3.2.2/ xiaobai@hadoop103:/opt/module/hadoop-3.2.2/
③. xsync集群分发脚本:
1). 需求:循环复制文件到所有节点的相同目录下:
2). 需求分析:
a. rsync命令原始拷贝:
rsync -av /opt/module xiaobai@hadoop104:/opt/
b. 期望脚本:
xsync要同步的文件名称
c. 期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径):
[xiaobai@hadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_144/bin:/opt/module/hadoop-3.2.2/bin:/opt/module/hadoop-3.2.2/sbin:/home/xiaobai/.local/bin:/home/xiaobai/bin
3). 脚本实现:
a. 在/home/xiaobai/bin目录下创建xsync文件:
[xiaobai@hadoop102 ~]$ cd /home/xiaobai/
[xiaobai@hadoop102 ~]$ mkdir bin
[xiaobai@hadoop102 ~]$ cd bin
[xiaobai@hadoop102 bin]$ vim xsync
在该文件中编写如下代码:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Argument!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ======= $host ======
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file);pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exits!
fi
done
done
tips:
#5. 获取父目录
pdir=$(cd -P $(dirname $file);pwd)
-P 表示进入根目录,而非软链接!#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host “mkdir -p $pdir”
-p 表示无论目标路径上的目标文件夹是否存在,都创建一个目标文件夹,以保证目标路径/目标文件夹 $ pdir/$fname存在!
b. 修改脚本xsync具有执行权限:
[xiaobai@hadoop102 bin]$ chmod +x xsync
tips:记得修改xsync权限!变色啦,xsync有了可执行的权限!
c. 测试脚本:
[xiaobai@hadoop102 ~]$ xsync /home/xiaobai/bin/
d. 将脚本复制到/bin中,以便全局调用:
[xiaobai@hadoop102 bin]$ sudo cp xsync /bin/
eg:同步当前/bin目录:
[xiaobai@hadoop102 ~]$ xsync bin/
查看hadoop103/hadoop104已经存在了xsync脚本:
e. 同步环境变量配置(root所有者)
[xiaobai@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
tips: 如果用了sudo,那么xsync一定要补全路径!
使用sudo找不到xsync命令,因为脚本在/home/xiaobai/bin/目录下,root用户找不到这个路径,所以用./bin/xsync当前路径,可找到xsync命令,可同步root用户;
在hadoop103/hadoop104上使用以下命令查看环境变量是否已经存在:
[xiaobai@hadoop103 bin]$ sudo vim /etc/profile.d/my_env.sh