Hadoop的分发脚本编写
手上有4台阿里云,正好可以搭建集群,就要把刚刚配置的单节点的数据拷贝过去。
编写集群分发脚本xsync
1. scp(secure copy)安全拷贝
(1)scp定义:
scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
语法
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 [...] [[user@]host2:]file2
简易写法:
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)的选项。
命令格式:
scp local_file remote_username@remote_ip:remote_folder 或者 scp local_file remote_username@remote_ip:remote_file 或者 scp local_file remote_ip:remote_folder 或者 scp local_file remote_ip:remote_file
- 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
- 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;
应用实例:
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3 scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music/001.mp3
(3)案例实操
(a)在hadoop101上,将hadoop101中/opt/module目录下的软件拷贝到其他节点上。
[root@hadoop001 hadoop]# scp -r /opt/module root@hadoop002:/opt/module The authenticity of host 'hadoop002 (47.111.251.212)' can't be established. ECDSA key fingerprint is SHA256:YNsodxgiTBhRi6BaO1LqQrkOeudAVMaRisZJQdaJdAA. ECDSA key fingerprint is MD5:b5:82:88:93:92:6a:01:ed:4d:6f:80:bc:68:1a:e8:c9. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'hadoop002,47.111.251.212' (ECDSA) to the list of known hosts. root@hadoop002's password: Permission denied, please try again. root@hadoop002's password: THIRDPARTYLICENSEREADME.txt 100% 142KB 6.2MB/s 00:00 LICENSE 100% 11KB 1.9MB/s 00:00 NOTICE 100% 13KB 2.2MB/s 00:00 3RDPARTY 100% 11KB 1.8MB/s 00:00 dblook.bat 100% 1387 236.1KB/s 00:00
(b)将hadoop101中/etc/profile文件拷贝到其他节点的/etc/profile上。
[root@hadoop001 hadoop-2.7.2]# scp /etc/profile root@hadoop002:/etc/profile root@hadoop002's password: profile 100% 2012 342.8KB/s 00:00 [root@hadoop001 hadoop-2.7.2]# scp /etc/profile root@hadoop003:/etc/profile root@hadoop003's password: profile 100% 2012 529.6KB/s 00:00 [root@hadoop001 hadoop-2.7.2]# scp /etc/profile root@hadoop004:/etc/profile
注意:拷贝过来的配置文件别忘了source一下/etc/profile,。
2. rsync 远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明
表2-2
选项 |
功能 |
-r |
递归 |
-v |
显示复制过程 |
-l |
拷贝符号连接 |
(2)案例实操
(a)把hadoop101机器上的/opt/module目录同步到hadoop003服务器的root用户下的/opt/目录
[root@hadoop001 hadoop]# vim /etc/hosts [root@hadoop001 hadoop]# rsync -rvl /opt/module/ root@hadoop003:/opt/module The authenticity of host 'hadoop003 (47.111.232.53)' can't be established. ECDSA key fingerprint is SHA256:YKGJjhv5Q/fneno2xR5HWQjFBkeZL09SF4RwtWI8tC4. ECDSA key fingerprint is MD5:30:ad:2b:59:1c:a8:37:d3:bf:69:6b:7d:8f:ee:3b:b8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'hadoop003,47.111.232.53' (ECDSA) to the list of known hosts. root@hadoop003's password: sending incremental file list created directory /opt/module ./ hadoop-2.7.2/ hadoop-2.7.2/LICENSE.txt hadoop-2.7.2/NOTICE.txt hadoop-2.7.2/README.txt hadoop-2.7.2/hdfs-site.xml hadoop-2.7.2/bin/ hadoop-2.7.2/bin/container-executor hadoop-2.7.2/bin/hadoop
3. xsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync命令原始拷贝:
rsync -rvl /opt/module root@hadoop103:/opt/
(b)期望脚本:
xsync要同步的文件名称
(3)脚本实现
(a)在/usr/local/bin目录下xsync创建文件,文件内容如下:
[root@hadoop002 module]# cd /usr/local/bin [root@hadoop002 bin]# ll total 4 -rw-r--r-- 1 root root 498 Jan 14 22:57 xsync [root@hadoop002 bin]# chmod 777 xsync [root@hadoop002 bin]# ll total 4 -rwxrwxrwx 1 root root 498 Jan 14 22:57 xsync [root@hadoop002 bin]# pwd /usr/local/bin [root@hadoop002 bin]# cat 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=3; host<5; host++)); do echo ------------------- hadoop$host -------------- rsync -rvl $pdir/$fname $user@hadoop00$host:$pdir done [root@hadoop002 bin]#