(小白向)MPI集群环境搭建–ubuntu 18.04

一、准备工作

1.1、VMware Workstation Pro下安装3个ubuntu 18.04虚拟机:master、node1、node2,作为三个节点。

1.2、用户名统一为:hadoop,免密登录时需要保证用户名一致,这样可以避免出现未知的问题。如果你看这篇博客已经不是相同用户名时,参考我末尾提到的更改用户名的博客。

所有工作都是在切换到hadoop用户下执行。特别是在SSH免密登录时生成密钥时,如果是root状态下,生成的密钥跟普通用户的不在同一个路径。

--------------------------------------------分割线开始--------------------------------------------------------

写在前面,熟悉linux的可跳过

一些常用命令(适合像我这样的小白,可以节省一些查命令的时间)

pwd --查看当前路径

ls --列出当前路径下所有文件或目录

ls -la --列出当前路径下的文件或目录权限

chmod 数字 文件或路径 --更改某个文件或目录路径(后面ssh.nfs中的目录如果不行,要考虑这个目录或文件的权限问题)

cd .. --返回上一级目录

cd --返回根目录

cd /home/user --进入/home/user目录下

cat /home/user/a.txt --查看/home/user目录下文件a.txt内容

mv old new --将old重命名为new

scp 文件1 服务器 --将本地文件复制到服务器下,如scp 空格 /home/user/a.txt 空格192.168.56.77:/home/user

scp 服务器 文件1 --将服务器的文件复制到本地

mkdir /home/test_dir --在/home下建立test_dir目录

touch /home/test_file --在/home建立文件test_file

sudo su --切换到root用户

su user --切换到普通用户user

常用编辑命令:sudo gedit /etc/a --用gedit打开a文件并编辑(推荐)

sudo vim /etc/a --用vim打开并编辑(进去输入i就可以开始编辑,退出:esc->输入 :wq!)

有些命令会提示权限不够,直接在命令最前面加上sudo

--------------------------------------------分割线结束--------------------------------------------------------

主节点:master

子节点:noed1、node2

1.3、配置的都是静态IP(设置静态IP),在每个节点的 /etc/hosts下,加入三个节点的IP,取别名:master、node1、node2

sudo gedit /etc/hosts

在里面编辑:192.168.43.60 master

192.168.43.61 node1

192.168.43.62 node2

检查三个节点是否可以相互ping通(ping都ping不同不要进行下面的操作),如

ping node1或ping 192.168.43.61

二、安装MPICH

2.1、在下载与安装编译环境之前,为了使软件包保持最新的状态,需要从源服务器下载最新的软件包列表(三个节点都需要!!!),在命令行中键入命令

sudo apt-get update

为了正常编译MPI代码,需要安装C, C++与Fortran的编译环境。build-essential工具提供了许多与编译相关的软件包,包括gcc/g++/gfortran等编译器、libc6-dev等必要的库与其他工具。apt-get命令的 -y 选项默认安装过程中同意所有的默认选择。
sudo apt-get install -y build-essential

下载与安装完成后,可键入下面的命令观察gcc版本信息。
gcc -v

2.2、安装mpich

sudo apt-get install -y mpich

查看版本

mpicc -v

三、SSH免密登录

3.1、在每个节点安装SSH服务(远程登录服务):

sudo apt-get install ssh

3.2、各节点生成私钥和公钥

ssh-keygen -t rsa // 生成的钥匙文件在 ~/.ssh/(在这里我的 ~ == /home/hadoop/.ssh)下,其他linux版本如CentOS路径会有所不同

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys //认证(执行该步后可以保证本机免密登录,使用ssh 用户名@IP进行测试,比如我在master节点上键入的这行,验证为:ssh hadoop@master 或者 [email protected],不用输入密码即可登录则说明成功)

3.3、把各子节点的 id_rsa.pub 传到主节点,注意路径问题,我此时路径是/home/hadoop/.ssh,id_rsa.pub就在它的目录下,所以scp命令直接输入文件名,不确定此时目录还是直接绝对路径吧,即 /home/hadoop/.ssh/id_rsa.pub

scp id_rsa.pub hadoop@master:~/.ssh/id_rsa.pub.node1

scp id_rsa.pub hadoop@master:~/.ssh/id_rsa.pub.node2

(这里我们把master是主节点,将node1、node2节点的钥匙文件传到master上,并重命名为id_rsa.pub.node1、id_rsa.pub.node2,因为master ./ssh下已经存在它自己的id_rsa.pub,不更改会把它覆盖)

3.4、在主节点master上操作,就是将子节点node1,node2传过来的要是加进主节点的~/.ssh/authorized_keys中。(可选)这步骤之前可以先查看里面的master钥匙内容(cat ~/.ssh/authorized),然后进行下面两个命令后再查看,可以对比,后者加进了子节点的钥匙。

cat ~/.ssh/id_rsa.pub.node1 >> ~/.ssh/authorized_keys//认证node1

cat ~/.ssh/id_rsa.pub.node2 >> ~/.ssh/authorized_keys//认证node2

在生成具有三个节点的钥匙后,主节点master要发钥匙给子节点node1,node2

scp authorized_keys hadoop@node1:~/.ssh/authorized_keys

scp authorized_keys hadoop@node2:~/.ssh/authorized_keys

3.5、验证无密码登录

如在node1节点上执行:ssh hadoop@master

四、建立和挂载NFS共享目录

4.1、在所有节点中建立相同路径下的相同目录:mkdir /home/hadoop/mpi_share

4.2、安装nfs

主节点master: sudo apt-get install nfs-kernel-server

子节点node1/2: sudo apt install nfs-common

4.3、主节点master操作,

sudo vi /etc/exports或sudo gedit /etc/exports

修改配置文件如下,格式:共享目录 IP(权限),这里加入的是master\node1\node2的IP:

/home/hadoop/mpi_share 192.168.43.60(rw,insecure,no_root_squash,no_all_squash,no_subtree_check,sync)

/home/hadoop/mpi_share 192.168.43.61(rw,insecure,no_root_squash,no_all_squash,no_subtree_check,sync)

/home/hadoop/mpi_share 192.168.43.62(rw,insecure,no_root_squash,no_all_squash,no_subtree_check,sync)

4.4、主节点master重启nfs服务:sudo /etc/init.d/nfs-kernel-server restart

关掉防火墙之类的,不然后面子节点挂载不上(我的每次重启就得执行下面两行命令):

sudo systemctl stop firewalld

sudo iptables -F

查看主节点提供挂载的目录及IP 。

子节点 showmount -e master

主节点 showmount -e

4.5、子节点挂载,格式:sudo mount -t nfs 主节点IP:共享目录路径 子节点要挂载的路径

sudo mount -t nfs master:/home/hadoop/mpi_share /home/hadoop/mpi_share

这种方式每次开机后得重新挂载,可以设置开机自动挂载,将上述挂载命令sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share 写到子节点 /etc/rc.local 文件中

sudo gedit /etc/rc.local

4.6、测试:在NFS主节点master的共享目录建立一个文件first.c并保存,几秒钟后检查其他节点中是否在共享目录中产生了该文件,若产生则配置成功。

建立和挂载NFS共享目录的目的: 保证主节点生成的可执行文件和需要的数据其他节点可以访问,这样就可以保证多个节点之间的并行(如果不执行这一步的话,需要将执行文件和需要的数据复制到每个节点的相同位置)。

五、集群下执行MPI程序

5.1准备工作

新建一个文件:mpi_config(注意路径,后面运行程序要用到,建议放在你的编译文件.o 的 同目录下)。mpi_config是在运行MPI程序时参考的配置文件,它显式注明每台机器各有几个CPU核。

编辑mpi_config_file(这个文件在后面执行程序时会作为参数包括在命令中):

sudo gedit mpi_config

因为我每台虚拟机分配了1核,所以在mpi_config中输入以下内容并保存:

master:1

node1:1

node2:1

查看修改后的文件

uploading.4e448015.gif正在上传…重新上传取消

格式:主机名(不是用户名):核数

查看主机名,其实就是 @后面跟着的那个

uploading.4e448015.gif转存失败重新上传取消

5.2、实验部分

编译文件(.o)路径(nfs共享路径下):/home/hadoop/mpi_share/TEST_1

uploading.4e448015.gif正在上传…重新上传取消

要看清自己路径,不然后面运行会命令的路径会有所不同!!!

运行命令 mpirun -np 进程数 -f ./配置文件 ./编译文件

实验一

mpirun -np 3 -f ./mpi_config ./first.o

uploading.4e448015.gif转存失败重新上传取消

uploading.4e448015.gif转存失败重新上传取消

uploading.4e448015.gif转存失败重新上传取消

uploading.4e448015.gif转存失败重新上传取消

实验代码:

实验一:first.c

#include "mpi.h"

#include

void main(int argc, char *argv[])

{

int myid,num,name;

char procname[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv); //实现对MPI环境的初始化

MPI_Comm_rank(MPI_COMM_WORLD, &myid); //获取个人身份

MPI_Comm_size(MPI_COMM_WORLD, &num); //获取给定组的大小

MPI_Get_processor_name(procname, &name);//获取节点名称

printf("Hello World! Process %d of %d on %s\n", myid, num, procname);

MPI_Finalize();//结束MPI环境

}

六、总结

记录个人搭建的过程,一路走了无数的坑,希望对大家有帮助。其实对小白来说,路径,用户、服务启动、配置文件等问题都是一个大问题。期间查了无数的网站,当程序能够在集群环境下运行输出“hello world”时,心里真的非常开心。也对那些贡献出博客的人充满感激,于是我也决定写下自己的过程。可能有疏漏,但尽可能详细了。总结:真的要有耐心,今天中午快崩溃,因为连续搭了几天,搭了几遍。但坑多的好处是,从不会建目录的linux命令,到很熟练一些命令。懂得了这个环境搭建过程。这就是进步,学有所得。

七、参考资料

以下是参考过的博客(有些博客地址关掉了窗口记不起来了,只弄一些比较靠谱的):

https://easyhpc.net/ (安装mpich教程)

https://blog.csdn.net/qq_36937342/article/details/80876385 (设置静态IP)

https://www.cnblogs.com/zeusmyth/p/6231350.html?from=singlemessage(更改主机名用户名,2(-2)修改shadow 文件时,先不要把原来的用户名的去掉,等最后再去!)

https://blog.csdn.net/secyb/article/details/78697976

https://blog.csdn.net/gys_20153235/article/details/80516560(它的第2步修改nfs文件不用做,我试了,不影响)

一些运行MPI程序问题参考博客:

https://blog.csdn.net/yhsweetlife/article/details/46654181

http://blog.sina.com.cn/s/blog_70012f010102yqbz.html