本文分享自华为云社区《基于Slurm集群的分布式图计算应用实践:Github协作网络影响力分析》,作者:yd_263841138 。

1. 引言

Slurm(Simple Linux Utility for Resource Management)是一个针对小型Linux集群的开源、容错、高可扩展的集群管理及作业调度系统,它具备统一管理集群内的计算资源、管理任务调度、监控作业任务等功能,能够在并行程序开发、验证过程中省去对集群计算资源管理配置的冗杂过程,高效助力分布式并行程序开发。

Gemini 是一个轻量级分布式图计算框架,其是后续多款大规模图计算框架的原型模板。Gemini既支持单机运行,也可以分布式多机运行。而多机运行的话,Gemini给出了在Slurm上提交作业的运行方案。

因此,一方面出于对作业调度系统部署过程的实践学习,另一方面出于后续对大规模图计算框架预研方向上的需要,最终决定尝试在通过多台华为云弹性服务器构建简易计算集群,并安装部署Slurm作业调度系统。

2. Slurm部署

2.1. 配置信息

关于华为云服务器配置,我以按需计费模式开通了三台通用入门型弹性云服务器(ECS)及其弹性公网IP,详细信息如下表。

规格类型 主机名 镜像 处理器 内存 硬盘规格 内网地址
通用入门型 master CentOS 7.9 64bit 1vCPUs 1GiB 通用型SSD 40 GiB 192.168.101
通用入门型 slave1 CentOS 7.9 64bit 4vCPUs 4GiB 通用型SSD 40 GiB 192.168.100
通用入门型 slave2 CentOS 7.9 64bit 4vCPUs 4GiB 通用型SSD 40 GiB 192.168.102

根据slurm部署规划,我以处理器规格为1vCPUs的master作为控制节点,不承担计算任务;以两台处理器规格为4vCPUs的slave1/2作为计算节点,构成集群的全部计算资源。

2.2. 部署过程

Slurm的部署过程比较复杂,这里以其官网文档的“Super Quick Start”指南作为参考进行部署,主要步骤包括:时钟同步、Munge配置、Slurm配置等步骤。

2.2.1. 时钟同步

这里采用ntp作为集群的时钟同步工具,其重点是对/etc/ntp.conf配置文件相关参数的编辑。

集群内时钟服务器节点

集群内的时钟服务器需要确定本服务器的所参照的时钟标准。这里将原本的默认服务器改为国内服务器。

#注释掉默认的外网时间服务器
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
# 添加中国国家授时中心服务器地址
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
# 添加允许上层时间服务器主动修改本机时间
restrict 0.cn.pool.ntp.org nomodify notrap noquery
restrict 1.cn.pool.ntp.org nomodify notrap noquery
restrict 2.cn.pool.ntp.org nomodify notrap noquery
restrict 3.cn.pool.ntp.org nomodify notrap noquery

修改完配置文件后,则先将当前服务器时钟与参照服务器进行对齐,接着开启ntp服务。

sudo ntpdate cn.pool.ntp.org
sudo service ntpd start

集群内其他服务器节点

集群内其他待同步的服务器节点的/etc/ntp.conf配置需要确定集群内时钟服务器主机名或IP地址,并允许其时钟被时钟服务器所修改。

# 从node01中同步时间
# server <YOUR CLOCK SERVER IP_ADDR/HOSTNAME>
server master
# 允许时间服务器修改本地时间
# restrict 时间服务器主机名或ip nomodify notrap noquery
restrict master nomodify notrap noquery

在完成配置文件的修改后,先将当前服务器时钟与时钟服务器的时钟进行对齐后,再启动ntp服务。

#sudo ntpdate <YOUR CLOCK SERVER IP_ADDR/HOSTNAME>
sudo ntpdate master
sudo service ntpd start

2.2.2 配置Munge

参照Munge官网安装指南中 Installing from RPMs on Red Hat compatible systems 进行安装。

首先,下载munge(munge.0.5.15.tar.xz和munge.0.5.15.tar.xz.asc两个文件)。

接着,参考Installing from RPMs onRed Hat compatible systems的指导进行安装。具体地,

  • 先从tarball构建SRPM,并根据SRPM安装依赖:
rpmbuild -ts munge-0.5.15.tar.xz
sudo dnf builddep SRPMS/munge-0.5.15-1.el9.src.rpm
  • 再验证安装下载的源码。下载dun.gpg,确保文件夹下由dun.gpg、munge-0.5.15.tar.xz和munge-0.5.15.tar.xz.asc三个文件。
rpmbuild -tb --with=verify --with=check munge-0.5.15.tar.xz
  • 此时munge、munge-devel、munge-libs或更多二进制RPMs就会生成。然后通过二进制RPMs安装:
sudo rpm --install --verbose \\
RPMS/x86_64/munge-0.5.15-1.el9.x86_64.rpm \\
RPMS/x86_64/munge-debugsource-0.5.15-1.el9.x86_64.rpm \\
RPMS/x86_64/munge-devel-0.5.15-1.el9.x86_64.rpm \\
RPMS/x86_64/munge-libs-0.5.15-1.el9.x86_64.rpm

munge不必获得root权限,但是需要具有对以下文件夹的所属:

  • ${sysconfdir}/munge

    [/etc/munge]

  • ${localstatedir}/lib/munge

    [/var/lib/munge]

  • ${localstatedir}/log/munge

    [/var/log/munge]

  • ${runstatedir}/munge

    [/run/munge]

创建munge密钥

sudo -u munge ${sbindir}/mungekey --verbose
#如果失败,则需手动切到/usr/local/sbin目录下执行mungeky

生成密钥存在于*${sysconfdir}/munge/munge.key*下,需要把这个密钥拷贝集群内所有机器的此目录中。

最后,开启munge守护进程(systemd方式)

# 开机自动启动
sudo systemctl enable munge.service
# 启动
sudo systemctl start munge.service
# 查看状态
sudo systemctl status munge.service
# 停止
sudo systemctl stop munge.service

2.2.3. 配置slurm

从官网下载slurm22xxxxx,

解压tar-ball: tar —bzip -x -f slurm*tar.bz2

进入Slurm源码目录,键入 ./configure 配置(可带例如—prefix=和—sysconfdir=选项)

键入 make 编译Slurm

键入 make install 安装程序、软件和库等。

配置slurm.conf

主要配置SlurmUser、以及节点、分区信息。

SlurmctldHost=master
ProctrackType=proctrack/linuxpro
# COMPUTE NODES
NodeName=slave2 Sockets=1 CPUs=4 CoresPerSocket=2 ThreadsPerCore=2 RealMemory=300 State=UNKNOWN NodeAddr=192.168.0.102
NodeName=slave1 Sockets=1 CPUs=4 CoresPerSocket=2 ThreadsPerCore=2 RealMemory=300 State=UNKNOWN NodeAddr=192.168.0.100
NodeName=master Sockets=1 Procs=1 CoresPerSocket=1 ThreadsPerCore=2 RealMemory=300 State=UNKNOWN NodeAddr=192.168.0.101
PartitionName=compute Nodes=slave1,slave2 Default=YES MaxTime=INFINITE State=UP
PartitionName=control Nodes=master Default=NO MaxTime=INFINITE State=UP

运行Slurm前,确保SlurmUser存在,相关目录(/var/spool/slurm/)存在,slurm.conf已拷贝到集群内所有机器同目录位置。

2.2.4. 测试运行

确保时间同步。

确保munge已开启。

控制节点

键入 slurmctld -D 显式运行,命令行打印运行信息。

计算节点

键入 slurmd -D 显式运行,命令行打印运行信息。

3. Github协作网络影响力分析

3.1. Gemini编程接口

Gemini图计算框架为用户设计自定义图应用算法提供了两个通用编程接口:process_vertices和process_edges。顾名思义,process_vertices即表示对顶点的遍历,用户需要另外提供顶点遍历时的自定义更新函数;process_edges即表示对边的遍历,用户需要另外提供自定义消息生成、规约函数。

3.1.1. process_vertices

process_vertices声明如下所示,其包含两个参数,分别是处理函数process以及活跃顶点集active。从使用角度而言,process即需要用户指明对顶点遍历时需要参照哪些数据、修改哪些数据;active的作用类似顶点开关,即在此轮顶点遍历中需要遍历哪些顶点。

template<typename R>
R process_vertices(std::function<R(VertexId)> process, Bitmap * active);

3.1.2. process_edges

process_edges的声明如下所示。由于Gemini在实际计算过程中会采用Sparse或Dense两种模式,因此这里需要分别提供Sparse和Dense的Signal和Slot方法(即发送信息、接收消息方法)。

template<typename R, typename M>
R process_edges(std::function<void(VertexId)> sparse_signal,
std::function<R(VertexId, M, VertexAdjList<EdgeData>)> sparse_slot,
std::function<void(VertexId, VertexAdjList<EdgeData>)> dense_signal,
std::function<R(VertexId, M)> dense_slot,
Bitmap * active,
Bitmap * dense_selective = nullptr) {

3.2. 预处理

这里通过Github日志信息来构建Github协作网络,以进一步分析得到用户、项目的影响力指标。因此,在具体分析计算之前,需要对原始数据进行抽取及预处理工作。

3.2.1. 日志抽取

针对Github日志数据的处理存在一些困难与挑战。比如,日志文件数据量大,难以处理;日志信息粒度极高,包含大量冗杂信息,需要进一步筛选。针对这些困难挑战,这里采取了相对应的处理措施。

首先,对日志文件按一定条目数进行批量切分,切分成大小均匀的一个个子文件再进行处理。如若不进行切分,那么倘若在处理程序执行过程中出现错误,则之前已处理的进度无法跟踪、处理好的数据只能舍弃再从头开始处理。

接着,再利用正则表达式结合python第三方库pandas对子文件信息进行处理。具体地,主要抽取仓库ID(repo_id)、开发者ID(actor_id)以及事件类型等字段。

3.2.2. 同构图转异构图

根据日志抽取得到的数据可构建出开发者与代码仓库之间的二部图,其分别以开发者、代码仓库为顶点,将各种事件抽象为二者之间的关系。而直接处理异构图本身是比较复杂的,因此这里将采取顶点降维的方式、将异构图分别转为仅含开发者或仅含代码仓库的同构图,分别求开发者之间的影响力指标与代码仓库之间的影响力指标。以转变为仅含代码仓库顶点的同构图为例,这里首先将开发者看作是“中继”,即一个开发者会直接与若干代码仓库产生联系。这里则将开发者所直接联系的若干代码仓库之间用边相连、相联系起来,这样即可消除起”中继“作用的开发者顶点,进而转变为只包含代码仓库顶点的同构图。

3.2.3 适配Gemini数据要求

Gemini要求用户提供图中顶点个数总数作为程序参数,并且要求对顶点序号进行顺序连续重编号。因此,为了符合Gemini的要求,这里对图的顶点序号进行重新编号,并通过哈希表记录重新编号后的顶点与原顶点的映射关系。

3.3. 程序设计

PageRank算法最初作为互联网网页重要度的计算方法,能有效反映互联网中网页的影响力。同样,将PageRank算法借鉴到Github协作网络影响力分析中也可得到开发者、代码仓库的影响力指标。因此,在算法设计上,这里参考PageRank算法,利用Gemini框架进行程序设计与实现。

Gemini源码已包含一个PageRank的测试样例,这里基于测试样例进行修改调整,以适配Github协作网络分析任务。在PageRank实现过程中,就编程方面比较核心的即是边遍历(process_edges)的过程。

graph->process_edges<int,double>(
[&](VertexId src){
// sparse_signal
graph->emit(src, curr[src]);
},
[&](VertexId src, double msg, VertexAdjList<Empty> outgoing_adj){
// sparse_slot
for (AdjUnit<Empty> * ptr=outgoing_adj.begin;ptr!=outgoing_adj.end;ptr++) {
VertexId dst = ptr->neighbour;
write_add(&next[dst], msg);
}
return 0;
},
[&](VertexId dst, VertexAdjList<Empty> incoming_adj) {
// dense_signal
double sum = 0;
for (AdjUnit<Empty> * ptr=incoming_adj.begin;ptr!=incoming_adj.end;ptr++) {
VertexId src = ptr->neighbour;
sum += curr[src];
}
graph->emit(dst, sum);
},
[&](VertexId dst, double msg) {
// dense_slog
write_add(&next[dst], msg);
return 0;
},
active
);

3.4. 程序运行

确认集群中Slurm系统正在运行,接着以提交作业的方式运行程序。

确认Slurm系统与资源状况

sinfo

编译并提交作业

make
srun -N 2 ./NewGemini/toolkits/pagerank ./NewGemini/github_data.dat 1000 8

4. 小结

本文实现了Slurm在弹性云服务器集群的安装与部署,整体流程较为简洁明了,但是在实际实施过程中仍会遇到些问题。对于Gemini框架的理解和使用仍比较局限。对此,根据整个部署过程下来后的心得体会,作如下几点小结:

  • 选择Centos镜像的话尽量选择Centos 7,否则Centos 8的话会遇到一些问题。
  • Munge的安装方法比较丰富,官网提供了git安装、RPM安装等多种安装方式。
  • 会出现缺少依赖、缺少文件夹、权限错误等问题,根据错误信息逐个解决即可。
  • Gemini对输入数据有一定要求,比如顶点需要顺序连续编号。并且如果当输入是带权图时,在写二进制文件时需额外注意。

这次实践比较简略,其目的主要实践学习作业调度软件在集群的部署过程,以及为分布式图计算应用提供初步NUMA资源架构环境,因而仅简要划分了控制节点与计算节点,并没有继续细分登录节点、部署数据库、考虑计费机制等问题。因此,在未来或需要继续深入思考以下几点内容:

  • 如何以实验场景、生产场景的标准部署Slurm。
  • 如何分析提交作业的程序性能、机器利用率。
  • 深入理解Gemini框架思想及接口,对照其他图计算框架继续学习。

参考资料

点击关注,第一时间了解华为云新鲜技术~

使用Slurm集群进行分布式图计算:对Github网络影响力的系统分析的更多相关文章

  1. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

  2. Redis集群与分布式介绍以及搭建Redis-Cluster

    1 Redis集群 1.1 什么是集群 集群就是很多服务器组成的一个网络.指的是将多台服务器集中在一起,实现同一业务. 1.2 为什么要集群 一台服务器不能满足开发需要的时候,需要多台服务器来支持.这 ...

  3. Quartz集成springMVC 的方案二(持久化任务、集群和分布式)

    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等. Quartz核心是调度器,还采用多线程管理. 1.持久化任务:当应用程序停止运行时,所有调度信 ...

  4. web中的集群与分布式

    面试中经常会提到 集群 和 分布式.下面就来分别说说这两个在web开发中经常用到的开发方式. 集群: 集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台.在客户端看来,一 ...

  5. 无人机集群的分布式协作 VI-SLAM

    以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 论文# D2SLAM: Decentralized and Distributed Col ...

  6. 3-3 Hadoop集群完全分布式配置部署

    Hadoop集群完全分布式配置部署 下面的部署步骤,除非说明是在哪个服务器上操作,否则默认为在所有服务器上都要操作.为了方便,使用root用户. 1.准备工作 1.1 centOS6服务器3台 手动指 ...

  7. rocketmq学习(二) rocketmq集群部署与图形化控制台安装

    1.rocketmq图形化控制台安装 虽然rocketmq为用户提供了使用命令行管理主题.消费组以及broker配置的功能,但对于不够熟练的非运维人员来说,命令行的管理界面还是较难使用的.为此,我们可 ...

  8. Hadoop1.X集群完全分布式模式环境部署

    Hadoop1.X集群完全分布式模式环境部署 1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS,Hadoop Distri ...

  9. 集群、分布式、SOA、微服务、webService等思想的整理

    引子:前几天甲方问我,他用wpf弄个界面,能不能通过其他语言给他传输数据,我由此想到了webservice(此时此刻,我也没有用过webServices),作日翻阅了一些资料,对这块技术有了个大概的了 ...

  10. 大数据系列(3)——Hadoop集群完全分布式坏境搭建

    前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一个真正的完全分布式的Hadoop集群,闲言少叙,进入本 ...

随机推荐

  1. 一文详述流媒体传输网络MediaUni

    一张「多元融合」的网络. 黄海宇|演讲者 大家好,我是阿里云视频云的黄海宇,今天分享主题是MediaUni--面向未来的流媒体传输网络设计与实践. 下面我将会从应用对流媒体传输网络的要求.MediaU ...

  2. servlet系列:简介和基本使用以及工作流程

    目录 一.简介 二.Servlet实现 三.基本使用 1.引入pom依赖 2.实现Servlet规范,重写service方法 3.配置web.xml 4.配置Tomcat 6.运行 四.Servlet ...

  3. 独奏者2 序章的wp

    0x01 0ctf_2017_babyheap 2023.7.24 国防科技大学 合肥 本题除了fastbin attack,最重要的是伪造fakechunk,使得存放chunk的指针有两个指向同一个 ...

  4. Python怎么通过url下载网络文件到本地

    以下代码演示Python怎么从网络下载一个文件至本地并保存在当前文件夹download import os import requests from urllib.parse import urlpa ...

  5. 【matplotlib基础】--坐标轴

    Matplotlib的坐标轴是用于在绘图中表示数据的位置的工具. 坐标轴是图像中的水平和垂直线,它们通常表示为 x 轴和 y 轴.坐标轴的作用是帮助观察者了解图像中数据的位置和大小,通常标有数字或标签 ...

  6. 在 RedHat Enterprise、CentOS 或 Fedora Linux 上安装 MongoDB

    在 RedHat Enterprise.CentOS 或 Fedora Linux 上安装 MongoDB 1.大纲 备注:采用yum安装后,所有进程将自动在/usr/bin下,如下的mongo.mo ...

  7. 遥遥领先.NET 7, .NET 8 性能大幅提升

    每个版本必有的性能提升汇总文章又来了.大家可以学习阅读了. 微软 .NET 开发团队的工程师 Stephen Toub 发表博客<Performance Improvements in .NET ...

  8. IDEA降低注解检测级别

    在 File | Settings | Editor | Inspections 选项中使用搜索功能找到 Autowiring for Bean Class,将 Severity 的级别由之前的 er ...

  9. SQL函数升序Asc,降序Desc使用总结

    关键字-升序Asc及降序Desc的使用语法 对某一结果集按列进行升序或降序排列即:结果集 Order by 列名/数字 Asc/Desc. 一.Asc,Desc排序讲以下5点 1.不写关键字Asc/D ...

  10. 深入理解 Skywalking Agent

    概述 Agent 功能介绍 + 整体结构 + 设计 插件机制详解 Trace Segment Span 详解 异步 Trace 详解 如何正确地编写插件并防止内存泄漏 扩展:如何基于 Skywalki ...