欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[大数据学习研究]2.利用VirtualBox模拟Linux集群

程序员文章站 2022-08-08 17:27:09
1. 在主机Macbook上设置HOST 前文书已经把虚拟机的静态IP地址设置好,以后可以通过ip地址登录了。不过为了方便,还是设置一下,首先在Mac下修改hosts文件,这样在ssh时就不用输入ip地址了。 sudo vim /etc/hosts 或者 sudo vim /private/etc/ ......

 

1. 在主机macbook上设置host

前文书已经把虚拟机的静态ip地址设置好,以后可以通过ip地址登录了。不过为了方便,还是设置一下,首先在mac下修改hosts文件,这样在ssh时就不用输入ip地址了。

sudo vim /etc/hosts

或者 

sudo vim /private/etc/hosts

 

这两个文件其实是一个,是通过link做的链接。注意要加上sudo, 以管理员运行,否则不能存盘。

 

##
# host database
#
# localhost is used to configure the loopback interface
# when the system is booting. do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
50.116.33.29 sublime.wbond.net
127.0.0.1 windows10.microdone.cn
# added by docker desktop
# to allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal

192.168.56.100 hadoop100
192.168.56.101 hadoop101
192.168.56.102 hadoop102
192.168.56.103 hadoop103
192.168.56.104 hadoop104
# end of section

 

2. 复制虚拟机

然后我们需要由上次配好的这一台虚拟机,复制出来多台,以便形成一个集群。首先关闭虚拟,在上面点右键,选复制,出现如下对话框,我选择把所有网卡都重新生成mac地址,以便模拟完全不同的计算器环境。

[大数据学习研究]2.利用VirtualBox模拟Linux集群

 

 

3. 修改每一台的host, ip地址

复制完毕后,记得登录到虚拟机,按照修改一下静态ip地址,免得ip地址冲突。

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

vi /etc/sysconfig/network-scripts/ifcfg-enp0s8

 

另外,最好也在每台linux 虚拟机里也设置一下hostname,以便这些虚拟机之前相互通讯时也可以使用hostname。需要依次把几台机器的hostname都设置好。

[root@hadoop101 ~]# hostnamectl set-hostname hadoop107
[root@hadoop101 ~]# hostname
hadoop107

 

4. xcall让服务器集群同时运行命令

因为我们同时有好几台机器,如果挨个挨个的登录上去操作,难免麻烦,可以写个shell脚本,以后从其中一台发起命令,让所有机器都执行就方便多了。下面是个例子。 我有hadopp100,hadopp101、hadopp102、hadopp103、hadopp104这个五台虚拟机。我希望以hadopp100为堡垒,统一控制所有其他的机器。 在/user/local/bin 下创建一个xcall的文件,内容如下:

 

touch /user/local/bin/xcall

chmod +x /user/local/bin/xcall

vi /user/local/bin/xcall

 

#!/bin/bash
pcount=$#
if((pcount==0));then
echo no args;
exit;
fi

echo ---------running at localhost--------
$@
for((host=101;host<=104;host++));do
echo ---------running at hadoop$host-------
ssh hadoop$host $@
done
~

 

比如我用这个xcall脚本在所有机器上调用pwd名称,查看当前目录,会依次提示输入密码后执行。

[root@hadoop100 ~]# xcall pwd
---------running at localhost--------
/root
---------running at hadoop101-------
root@hadoop101's password:
/root
---------running at hadoop102-------
root@hadoop102's password:
/root
---------running at hadoop103-------
root@hadoop103's password:
/root
---------running at hadoop104-------
root@hadoop104's password:
/root
[root@hadoop100 ~]#

 

5. scp与rsync

然后我们说一下 scp这个工具。 scp可以在linux间远程拷贝数据。如果要拷贝整个目录,加 -r 就可以了。

[root@hadoop100 ~]# ls
anaconda-ks.cfg
[root@hadoop100 ~]# scp anaconda-ks.cfg hadoop104:/root/
root@hadoop104's password:
anaconda-ks.cfg 100% 1233 61.1kb/s 00:00
[root@hadoop100 ~]#

 

 

另外还可以用rsync, scp是不管目标机上情况如何,都要拷贝以便。 rsync是先对比一下,有变化的再拷贝。如果要远程拷贝的东西比较大,用rsync更快一些。 不如rsync在centos上没有默认安装,需要首先安装一下。,我们的虚拟机已经可以联网了,所以在线安装就可以了。

rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
命令 命令参数 要拷贝的文件路径/名称 目的用户@主机:目的路径
选项
-r 递归
-v 显示复制过程
-l 拷贝符号连接

 

[root@hadoop100 ~]# xcall sudo yum install -y rsync

比如,把hadoop100机器上的java sdk同步到102上去:

[root@hadoop100 /]# rsync -r /opt/modules/jdk1.8.0_121/ hadoop102:/opt/modules/jdk1.8.0_121/

 

 

然后我们需要一个能把内容自动同步到集群内所有机器的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

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

#5 循环
for((host=100;host<105;host++));do
#echo $pdir/$fname $user@hadoop$host:$pdir
echo ---------hadoop$host
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

 

6. ssh免密登录设置

在执行上面的命令时,发现每次都要输入密码,这个也挺烦的,而且后期hadoop集群在启动时也会需要各机器之前相互授权,如果每次都输入密码,确实太麻烦了,所以需要设置一下ssh免密登录。

首先用ssh-keygen -t rsa 生成秘钥对,过程中都按回车介绍默认值即可。然后用ssh-copy-id 其他主机,把公钥发送给要登录的目标主机,在这个过程中需要输入密码以便授权。成功后就可以按照提示用ssh 远程登录到其他主机了,并不要求输入密码。

 

[root@hadoop104 ~]# ssh-keygen -t rsa
generating public/private rsa key pair.
enter file in which to save the key (/root/.ssh/id_rsa):
enter passphrase (empty for no passphrase):
enter same passphrase again:
your identification has been saved in /root/.ssh/id_rsa.
your public key has been saved in /root/.ssh/id_rsa.pub.
the key fingerprint is:
sha256:x0i1f6intppijgvhxjmsz6hmaewifxa7tmjr9i9yco8 root@hadoop104
the key's randomart image is:
+---[rsa 2048]----+
| ..+o*.o. |
| ==*== |
| =x+o.o |
| b+.@ + o |
| *s.e * . .|
| . .+o+. |
| o+... |
| . o. |
| .o. |
+----[sha256]-----+
[root@hadoop104 ~]# ssh-copy-id hadoop100
/usr/bin/ssh-copy-id: info: source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: info: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: info: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@hadoop100's password:

number of key(s) added: 1

now try logging into the machine, with: "ssh 'hadoop100'"
and check to make sure that only the key(s) you wanted were added.

[root@hadoop104 ~]#     当前在hadoop04下

[root@hadoop104 ~]# ssh hadoop100      
last failed login: mon sep 16 13:15:35 cst 2019 from hadoop103 on ssh:notty
there were 5 failed login attempts since the last successful login.
last login: mon sep 16 09:37:51 2019 from 192.168.56.1
[root@hadoop100 ~]#     已经在目标主机下了 

 

按照上面的方法,把所有集群之间都设置好免密登录,也就是每台机器上都ssh-keygen生成一个秘钥对,然后ssh-copy-id到其他几台虚拟机。

 

好了,到现在基本的工具和集群环境搭建起来了,后面就可以开始hadoop的学习了。