注意分布式集群操作一定会用到ssh,所以要开启ssh服务。并且要网络能够互相ping通

scp(secure copy)安全拷贝

这部分是分发脚本的基础介绍。如果只是想快速搭建,这部分可跳过。

  1. 定义

    可以实现服务器于服务器之间的数据拷贝。(一个服务器中的数据拷贝给另一个服务器)

  2. 基本语法

    1
    2
    3
    4
    5
    scp     -r           $pdir/$fname 							$user@$host:$pdir/$fname
    命令名 递归方式执行 被拷贝的文件的用户名@主机,文件目录/文件名 接收的用户名@主机:存放目录/存放文件名

    如果是要拉取资源,也就是被拷贝文件是对方服务器,就将 $user@$host: 写在对象资源路径前:
    scp -r $user@$host:$pdir/$fname $pdir/$fname
  3. 演练1

    将hadoop103的家目录下的a1.log(在家目录下新建一个:touch ~/a1.log)拷贝到hadoop105的家目录下

    被拷贝的文件:/home/hadoop103/a1.log

    拷贝目标:hadoop@192.168.64.105:/home/hadoop105/a1_copy.log

    1
    scp -r /home/hadoop103/a1.log hadoop105@192.168.64.105:/home/hadoop105/a1_copy.log

    注意,执行之后回询问是否继续连接,输入yes后,回要求输入对方的密码,过程如下:

    发送a1.log

    去hadoop105检查一下:

    验证发送成功

    可以看到已经移动过去了。

  4. 演练2

    演练一是发送的感觉,现在试试拉取(a1_copy.log),本地存储为a1.log

    把hadoop103下的a1.log删除掉rm ~/a1.log

    在hadoop103下:

    数据来源的地方写的hadoop105@192.168.10.105:/home/hadoop105/a1_copy.log

    1
    scp -r hadoop105@192.168.64.105:/home/hadoop105/a1_copy.log /home/hadoop103/a1.log

    scp2

    如图即为成功。

    rsync远程同步指令

    这部分也是分发脚本的基础介绍。如果只是想快速搭建,这部分可跳过。

    1. 定义

      主要侧重在同步,意思是原本就有一部分数据,但是一方做出了变动,想要同步,这时候不需要再完全复制一份。

      rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。

      rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。

    2. 基本语法

      1
      2
      3
      4
      5
      6
      7
      8
      rsync 	-av 		$pdir/$fname 		 $user@$host:$pdir/$fname
      命令名 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称

      如果是拷贝来源是对方,就给对方加 $user@$host: 就好了,(拉取资源时):
      rsync -av $user@$host:$pdir/$fname $pdir/$fname

      -a 归档拷贝
      -v 显示复制过程
    3. 演练

      同步/home/hadoop103,只有hadoop103中才有a1.log文件(在hadoop104下操作)

      1
      rsync -a hadoop103@192.168.64.103:/home/hadoop103 /home/hadoop104

      由于有-v命令回显示很多内容(显示很多内容不一定时全都拷贝了,只是显示出来了)。

      注意看输入的命令的路径是/home/hadoop103,因为a1.log在/home/hadoop103下。如果在/home下,会把对方整个home拉取拷贝到/home/hadoop104下,这个时候的结果实际上就是:/home/hadoop104/hadoop103就不是同步资源了,就完全是新拷贝了一份资源。

配置SSH免密登录

我们提到了集群会经常用ssh,每次使用都要使用密码会很麻烦,上面可以看出来的。下面就介绍配置免密登录

这个是为之后的集群分发脚本打基础,有了这个会方便一些。

原理和终端连接Ubuntu类似,可参看。

在hadoop103下操作:

  1. 只要执行过ssh命令就会多出来一个.ssh目录,现在cd到.ssh目录,多产生一个公钥和一个密钥。

    1
    ssh-keygen -t rsa

    按三次回车即可:

    生成密钥

    ~/.ssh目录下会多生成两个文件,一个id_rsa是密钥,id_rsa.pub就是公钥。

  1. 然后将公钥拷贝到服务器:

    1
    cat ./id_rsa.pub >> ./authorized_keys

    再检查一下登录本地是否需要密码:

    1
    ssh localhost

    验证免密登录

    这样是自己登录时的免密登录。

    之后需要配置其他服务器登录自己服务器也免密登录:

    (当前操作的服务器是hadoop103嘛,以传递给hadoop104为例):

    1
    ssh-copy-id hadoop104@192.168.10.104

    公钥配置给别人

    然后检查一下登录hadoop104试试需不需要密码:

    1
    ssh hadoop104@192.168.64.104

    检验是否配置成功

    如果不需要设置密码就算设置好了。

  2. 同理,将hadoop103的传递给hadoop104、hadoop105

总结一下就是三条命令

1
2
3
4
ssh-keygen -t rsa
cat ./id_rsa.pub >> ./authorized_keys
ssh-copy-id username@IP # 跟的是要递交的用户名@IP地址或主机名
exit # 退出

配置自己的ssh免密登录:先用cat id_rsa.pub获取到公钥,然后再vim authorized_keys在文件中添加新的公钥,之后保存退出。

然后在其他三台服务器上同样操作(每台服务器都要产生公钥在拷贝给另外两台)。(不过可以提前配置一下端口映射,先看下一段,配置之后操作简单很多)。

配置服务器别名

终端连接Ubuntu类似,同样的道理来配置服务器别名:

用vim编写:/etc/hosts

1
sudo vim /etc/hosts

下如下内容:

1
2
3
4
# hadoop
192.168.64.103 hadoop103
192.168.64.104 hadoop104
192.168.64.105 hadoop105

如图:

配置端口号

这就是把第一台的弄好了,接下来换到其他两台服务器,直接复制这段内容即可。

到目前,登录hadoop104的命令从原来的:ssh hadoop104@192.168.64.104变成了ssh hadoop104@hadoop104.

接着配置服务器别名(还是先在hadoop103下操作):

1
2
3
touch ~/.ssh/config # 在~/.ssh目录下创建文件config

vim ~/.ssh/config # 编写config

写下内容:

1
2
3
4
5
6
7
8
9
Host hadoop103
HostName hadoop103
User hadoop103
Host hadoop104
HostName hadoop104
User hadoop104
Host hadoop105
HostName hadoop105
User hadoop105

编辑配置信息

同样,在其他三台服务器上进行同样操作。

这样完成后,上一步的ssh hadoop104@hadoop104也变成了:ssh hadoop104。更简洁了,当然,如果了愿意,也可以配置得更短,更简单。

OK,现在可以继续去弄一下免密登录啦,会方便很多啦。例如上面知识配置了hadoop103免密登录hadoop104,现在配置hadoop103免密登录hadoop105只需要:ssh-copy-id hadoop105

正式编写集群分发脚本

脚本内容其实就是封装了一下rsync命令,也不复杂。

  1. 需求

    循环赋值文件到所有节点的相同目录下

  2. 分析和准备

    想要全局使用就要放在全局目录下(配置了PATH的目录下),配置了PATH的目录:

    为了安全把脚本写在/home/hadoop103/bin,新建这个目录,然后配置环境变量:

    1
    mkdir /home/hadoop103/bin

    然后配置环境变量:

    1
    vim ~/.bashrc

    写入内容:

    1
    export PATH=$PATH:/home/hadoop103/bin

    配置环境变量

    然后刷新:source ~/.bashrc

    检验一下,输入echo $PATH

    检查环境变量

    可以看到新的环境变量已经添加到原本到系统变量后了。

  3. /home/hadoop103/bin下新建脚本,写脚本

    1
    2
    touch ~/xsync
    vim ~/xsync

    写入脚本内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/bin/bash

    #1. 判断参数个数,如果小于1,就直接退出
    if [ $# -lt 1 ]
    then
    echo Not Enough Arguement!
    exit;
    fi

    #2. 遍历集群所有机器
    #for host in hadoop102 hadoop103 hadoop104 这种写法要求配置了对应名称的IP地址,没配置,就直接写IP地址
    # 本来主机名就要转化成IP地址的,所以直接用IP地址也没问题
    for host in hadoop103 hadoop104 hadoop105
    do
    echo ==================== $host ====================
    #3. 遍历所有目录,挨个发送
    for file in $@
    do
    #4. 判断文件是否存在,存在是核心代码
    if [ -e $file ]
    then
    #5. 获取父目录
    pdir=$(cd -P $(dirname $file); pwd)

    #6. 获取当前文件的名称
    fname=$(basename $file)

    #7. 直接跳转到对应host去(相当于100跳转到102操作102),跳转过去执行引号例的脚本命令
    ssh $host "mkdir -p $pdir"

    #8. 执行同步命令
    rsync -av $pdir/$fname $host:$pdir
    else
    echo $file does not exists!
    fi
    done
    done
  4. 给脚本添加可执行权限:

    1
    chmod +x xsync
  5. 测试使用,把hadoop目录给分发过去,这样hadoop也就出现在其他两台服务器上了

    1
    xsync /usr/local/hadoop

    注意:如果用了 sudo,那么 xsync 一定要给它的路径补全:sudo ./bin/xsync /usr/local/hadoop

    我在分发到时候遇到了问题,就是说权限不允许,解决办法:

    在其他两台服务器:

    1
    2
    3
    sudo mkdir /usr/local/hadoop
    sudo chown hadoop104 hadoop # hadoop105 下写 hadoop105
    sudo chgrp hadoop104 hadoop # hadoop105 下写 hadoop105

    然后再执行脚本分发命令,就分发过去了。

到这里集群分发脚本就写好了。在其他两台服务上也如此操作。

注意集群分发脚本的使用就是直接分发这个目录,最好是路径是都有的。

如果:xsync /home/hadoop103/bin不是把bin给其他两个服务器,而是在其他两个服务器的/home目录下新建:/hadoop103/bin。和想的不一样哦,不是在/home/hadoop104/home/hadoop105目录下新建bin目录。

可以继续看搭建Hadoop集群