暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

做一个实用的集群文件分发脚本 xsync

KK架构师 2021-07-06
522

一、问题产生背景





在学大数据的时候,会自己搭建一个小型集群做测试使用,经常会在某台机器上配置好,然后依次分发到其他机器上。
通常使用的是 scp 命令,格式如:
scp -r jdk8 root@hadoop002:/usr/local/
scp -r jdk8 root@hadoop003:/usr/local/

观察一下这个命令,就会发现这里面很多不足:
(1)很多重复的部分
(2)通常集群之间的文件位置都是相同的,所以可以不指定具体位置
(3)指令太长,希望的是 xsync jdk8,即可自动分发到其他机器上

有了基本想法,下面我们做一个 shell 脚本来实现
先来补充一下这个脚本所需要的基础知识(可以直接跳到第四 part,脚本实现)


二、基础知识补充





1、scp 与 rsync 的区别
scp (secure copy)安全拷贝,可以实现服务器与服务器之间的数据拷贝,基本语法是:
    scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
    scp -r 文件 用户@host:位置
    rsync 速度快,可以增量拷贝,避免复制相同的内容和支持符号链接的优点。
    基本语法是:
      rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname

      其中三个参数的含义是


      2、ssh 免密登录
      通常我们使用 ssh 来远程登录到 linux 机器上,那我们的文件分发也是需要登录到对方服务器上的,不可能每次分发文件都要输入密码,所以需要预先配置好 ssh 免密登录。
      (1)首先需要依次更改主机名字
      vi etc/sysconfig/network
      (2)修改 etc/hosts 文件,可以通过访问机器名来访问 ip
      (3)在一台机器上生成公钥和私钥
      ssh-keygen -t rsa
      一路回车,会在 ~/.ssh 下产生公钥和私钥文件
      在每台机器上执行 ssh-copy-id 机器名,把公钥发送到其他主机

      3、shell 脚本 for 循环语法
        #!/bin/bash


        for((i=1;i<=10;i++));
        do
        echo $(expr $i \* 3 + 1);
        done

        三、脚本实现





        在 home/hadoop/bin 下 
        touch xsync
        vi xsync
          #!/bin/bash
          #1 获取输入参数个数,如果没有参数,直接退出
          pcount=$#
          if((pcount==0)); then
          echo no args;
          exit;
          fi


          #2 获取文件名称
          p1=$1
          fname=`basename $p1`
          echo fname=$fname


          #3 获取上级目录到绝对路径
          pdir=`cd -P $(dirname $p1); pwd`
          echo pdir=$pdir


          #4 获取当前用户名称
          user=`whoami`


          #5 循环
          for((host=103; host<105; host++)); do
          echo ------------------- hadoop$host --------------
          rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
          done
          给脚本赋予可执行权限,chmod 777 xsync
          使用方法:
          xsync jdk8
          即可把 jdk8 这个文件夹发送到各个机器的相同目录上了。


          四、疑难点解析





          如何获取到待发送文件的文件名和绝对路径?
          basename jdk8,即可获得当前文件的文件名
          pdir=`cd -P $(dirname $p1); pwd`
          这条命令是什么意思
          dirname opt/module/jdk/,可以获得 jdk8 的绝对路径 opt/module
          为何要加一个 cd -P 命令呢?
          如果我们发送的文件是一个软连接,那么 cd -P 会 cd 到软链接的真实目录下,而不是软链接本身所在的目录,可以考虑到发送的文件是一个软链接的情况。


          五、作者说





          使用这个脚本可以极大的提升集群间传输文件的效率,不用再重复的敲冗长的 scp 指令了。
          使用脚本之前,需要先配置机器之间的免密登录,不要忘了。
          祝大家生活愉快
          文章转载自KK架构师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论