Hadoop--入门
编写集群分发脚本xsync
在配置完全分布式的时候我们需要将主结点的配置文件分发到多台从结点上,使用xsync脚本就不用照着主节点一个个去改从结点的配置文件,比较省时省力,这个脚本内套rsync命令和循环,rsync相对于使用scp更快更简便,可以一次将文件分发到多台机器上,使用这个脚本能极大的提升集群间传输文件的效率
1.rcp命令
Linux rcp命令用于复制远程文件或目录。
rcp指令用在远端复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中。
命令格式:
rcp [-pr][源文件或目录][目标文件或目录]
rcp [-pr][源文件或目录...][目标文件]
参数说明:
-p 保留源文件或目录的属性,包括拥有者,所属群组,权限与时间。
-r 递归处理,将指定目录下的文件与子目录一并处理。
2.scp命令
Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
命令格式:
scp [可选参数] [file_source源文件或目录] [file_target目标文件或目录]
参数说明:
-1: 强制scp命令使用协议ssh1
-2: 强制scp命令使用协议ssh2
-4: 强制scp命令只使用IPv4寻址
-6: 强制scp命令只使用IPv6寻址
-B: 使用批处理模式(传输过程中不询问传输口令或短语)
-C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p:保留原文件的修改时间,访问时间和访问权限。
-q: 不显示传输进度条。
-r: 递归复制整个目录。
-v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port:注意是大写的P, port是指定数据传输用到的端口号
-S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
实例:
把本地文件拷贝到远程机器指定目录
[root@master hadoop-2.7.2]# scp -r liubei.txt root@node1://home/hadoop/hadoop2.7/hadoop-2.7.2
liubei.txt 100% 15 1.2KB/s 00:00
[root@master hadoop-2.7.2]# ssh root@node1
Last login: Fri Apr 3 09:21:21 2020 from 192.168.252.101
[root@node1 ~]# cd /home/hadoop/hadoop2.7/hadoop-2.7.2
[root@node1 hadoop-2.7.2]# ls
bin data etc include lib libexec LICENSE.txt liubei.txt logs NOTICE.txt README.txt sbin share
3.rsync 远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新,scp是把所有文件都复制过去
。
命令格式:
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
参数说明:
-r 递归
-v 显示复制过程
-l 拷贝符号连接
4.xsync集群分发脚本
需求:循环复制文件到所有节点的相同目录
下
1.创建文件
先来到/root
下,创建bin目录,并在bin目录下xsync创建文件
[root@master ~]# mkdir bin
[root@master ~]# cd bin/
[root@master ~]# touch xsync
[root@master ~]# vi xsync
2.编写代码
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$# #$#获取当前输入变量的个数
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1 #$1获取第一个输入的数据
fname=`basename $p1` #basename:获取输入的数据文件自身的名称 如p1为/home/hadoop/hadoop2.7/hadoop-2.7.2/liubei.txt,fname为liubei.txt
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd` #dirname:获取文件的目录名:如/home/hadoop/hadoop2.7/hadoop-2.7.2/liubei.txt,pdir为/home/hadoop/hadoop2.7/hadoop-2.7.2
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
#这里的循环是要根据你自己虚拟机的配置IP进行更改,比如我的主节点IP为xxx.xxx.xxx.101,从结点为102,103,104,我在执行这个脚本的时候需要把文件分发到三台从结点上,那循环的开始就为102,结束为<105,然后你rsync中也要改为你自己虚拟机IP的前三位
for((host=102; host<105; host++)); do
echo ---------------------- 192.168.252.$host ----------------
rsync -rvl $pdir/$fname $user@192.168.252.$host:$pdir
done
3.修改脚本 xsync 具有执行权限
[root@master bin]$ chmod 777 xsync
4.调用脚本形式:xsync 文件名称
[root@master hadoop-2.7.2]# xsync /home/hadoop/hadoop2.7/hadoop-2.7.2/liubei.txt
fname=liubei.txt
pdir=/home/hadoop/hadoop2.7/hadoop-2.7.2
---------------------- 192.168.252.102 ----------------
sending incremental file list
liubei.txt
sent 76 bytes received 37 bytes 226.00 bytes/sec
total size is 15 speedup is 0.13
---------------------- 192.168.252.103 ----------------
sending incremental file list
liubei.txt
sent 91 bytes received 31 bytes 244.00 bytes/sec
total size is 15 speedup is 0.12
---------------------- 192.168.252.104 ----------------
sending incremental file list
liubei.txt
sent 91 bytes received 31 bytes 48.80 bytes/sec
total size is 15 speedup is 0.12