1.前提建议:建议先了解一下Linuxshell脚本
2.相关知识:
(1)scp(secure copy)安全拷贝
scp可以实现服务器与服务器之间的数据拷贝
SCP的工作原理类似于SSH(Secure Shell)协议,它通过加密通道传输文件,并使用用户凭证进行身份验证。用户可以使用SCP命令在远程主机之间复制文件,也可以从本地主机向远程主机复制文件
基本语法:
scp -r $pdir/$fname $user@$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
案例:
在把hadoop1中的jdk文件传输给Hadoop2(/opt/module)
第一种方式(在hadoop1上操作)
scp -r /opt/module/jdk haha2@hadoop2:/opt/moudle/
或者是在hadoop2上操作:
scp -r haha1@hadoop1:/opt/moudle/jdk /opt/module
(2)rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点
它可以通过远程shell或rsync协议进行文件传输、远程协作等。 可以用于备份本地文件到远程服务器,或将远程服务器上的文件同步到本地,也可以将多个服务器上的文件同步到一个中心服务器上
基本语法:
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
其中的参数 -a:归档拷贝
-v: 显示复制过程
案例:
rsync -av /opt/module/Hadoop haha2@hadoop2:/opt/moudle/Hadoop
(3)scp和rsync的区别:
用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
3.xsync集群分发脚本:
主要是在hadoop中把文件分发到所有节点的相同目录之下
主要用到rsync命令
期望脚本命令是xsync 同步文件名称
(1)步骤:
查看全局环境变量的路径 echo $PATH
会显示出相关的全局环境变量生效的路径目录,其中有一个是/home/haha1/bin (这个目录在创建的时候没有创建,需要手动创建)
(2)脚本实现:
[haha1@hadoop102 opt]$ cd /home/haha1
[haha1@hadoop102 ~]$ mkdir bin
[haha1@hadoop102 ~]$ cd bin
[haha1@hadoop102 bin]$ vim xsync
文件中的代码:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器(注意根据集群中的节点服务器的个数进行更改脚本)
for host in hadoop1 hadoop2
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 exists!
fi
done
done
(3)修改文件的权限:chmod 777 xsync
(4)应用脚本分发给hadoop2
xsync /home/haha1/bin
执行成功
参考文档:尚硅谷Hadoop3.1.3