一、前置准备

CentOS7、jdk1.8、hadoop-2.7.7

二、简单了解



​basename​​:会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来



​dirname​​:从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录的部分)



Shell数组用括号来表示,元素用空格符号分割,Shell中使用@ 或 * 可以获取数组中的所有元素



rsync是根据自己独特的算法,只同步有变化的文件,甚至在一个文件里只同步有变化的部分,所以可以实现快速的同步数据的功能

-v, --verbose 详细模式输出
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD



三、脚本源码

#!/bin/bash

USAGE="使用方法:sh distribution.sh /home/xiaokangxxs.txt or sh distribution.sh /opt/software/hadoop-2.7.7"
if [ $# -ne 1 ];then
echo $USAGE
exit 1
fi
#获取需要分发的文件名或者目录名
FDNAME=$(basename $1)
#获取需要分发的文件或目录的上级目录
PDIR=$(cd -P $(dirname $1);pwd)
#获取当前使用系统的用户名
USER=$(whoami)
#需要分发到的节点
NODES=("hadoop02" "hadoop03")
#循环分发
for NODE in ${NODES[*]};do
echo "--------分发至$NODE--------"
#如果目标节点的父级目录不存在,则创建出来
ssh $NODE "
if [ -d $PDIR ];then
. /etc/profile
else
mkdir $PDIR
fi"
rsync -av $PDIR/$FDNAME $USER@$NODE:$PDIR
done
echo "----------------------------------------------------------------------------------------"

四、测试使用

# 修改脚本权限
[xiaokang@hadoop01 ~]$ chmod 777 distribution-plus.sh

执行方式:

# 方式一
[xiaokang@hadoop01 bigdata_bin]$ ./distribution-plus.sh zk.sh
# 方式二
[xiaokang@hadoop01 bigdata_bin]$ sh distribution-plus.sh zk.sh
# 方式三
# 1.将shell脚本所在目录配置为环境变量(/etc/profile),记得source生效
export SHELL_HOME=/home/xiaokang/bigdata_bin
export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${ZOOKEEPER_HOME}/bin:${HIVE_HOME}/bin:${HBASE_HOME}/bin:${KYLIN_HOME}/bin:${KAFKA_HOME}/bin:${SCALA_HOME}/bin:${SCALA_HOME}/sbin:${SPARK_HOME}/bin:${SHELL_HOME}/:$PATH
# 2.在任意目录都可以使用自己编写的shell脚本
[xiaokang@hadoop01 ~]$ distribution-plus.sh ~/bigdata_bin/zk.sh

分发​​/opt/software/hadoop-2.7.7/etc/hadoop/slaves​​文件,进行测试