我有一个使用master/salve概念进行并行化的程序。有一个主目录和多个辅助目录。我应该首先在主目录中运行执行文件,然后转到工作目录并在每个目录中运行工作执行文件。主控器等待工人完成他们的工作,并将结果发送给主控器以进行进一步的计算。工作目录的作业是相互独立的,因此它们可以在不同的机器(节点)上运行。主程序和工作程序使用TCP/IP communications Protoco相互通信。
我在一个有16个节点的集群上工作,每个节点有28个内核,带有slurm job Manager。我可以运行我的工作与20个工人在一个节点上总共罚款。目前,我的slurm脚本如下所示:
#!/bin/bash
#SBATCH -n 1 # total number of tasks requested
#SBATCH --cpus-per-task=18 # cpus to allocate per task
#SBATCH -p shortq # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00 # run time (hh:mm:ss) - 12.0 hours in this.
cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!
cd /To-Parent
# This is the directory that contains all worker (wrk)directories
parallel -i bash -c "cd {} ; worker.exe /h 127.0.0.1:4004" --
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}
我想知道如何修改这个脚本,以便在多个节点之间划分在workers上运行的作业。例如,与wrk1到wrk5相关联的作业在节点1上运行,与wrk6到wrk10相关联的作业在节点2上运行,等等?
首先,您需要让Slurm为您的作业分配不同的节点,因此您需要删除--cpus-per-task
选项,而是请求18个任务。
其次,您需要获得主程序运行的主机名,因为127.0.0.1
在多节点设置中不再有效。
第三,只需在调用paralle
中的bash
之前添加srun
。使用--exclusion-n1-c1
,它将把parallel
生成的worker的每个实例分派给分配中的每个CPU。它们可能在同一个节点上,也可能在其他节点上。
#!/bin/bash
#SBATCH -n 18 # total number of tasks requested
#SBATCH -p shortq # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00 # run time (hh:mm:ss) - 12.0 hours in this.
cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!
MASTER_HOSTNAME=$(hostname)
cd /To-Parent
# This is the directory that contains all worker (wrk)directories
parallel -i srun --exclusive -n 1 -c 1 bash -c "cd {} ; worker.exe /h $MASTER_HOSTNAME:4004" --
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}
当将master设置为local[*]时,我已经能够在IntelliJ Idea中成功运行Spark应用程序。然而,当我将master设置为Spark的单独实例时,会发生异常。 下面是我尝试执行的SparkPi应用程序。 这是我的身材。sbt内容: 以下是我的plugins.sbt内容: 通过在同一台机器上的不同命令提示中使用以下命令,我执行了Spark Master和worker。 [主人和工人
我有一个多分支管道架构的以下Jenkinsfile 我试图在Ubuntu和Red Hat节点上并行运行“构建”阶段,而仅在Ubuntu节点上运行“测试”阶段。 任何人都可以帮助我指定如何选择在哪些节点上运行哪些阶段。我在网上找到的解决方案很少,但他们建议重写构建阶段两次:一次用于Red Hat节点,另一次用于Ubuntu节点。难道没有办法在没有代码重复的情况下做到这一点吗? 非常感谢
我们在银行有100个账户和两个办事员,作为线程实现,他们使用同步方法transferMoney将每1000倍的资金从accountNumberFrom账户转移到accountNumberTo账户。由于所有账户都以余额0开头,并且从一个账户取回的资金被转移到另一个账户,因此在所有交易之后,余额应该为零。大多数时候都是这样,但并不总是这样。虽然很少发生,但有时交易后的余额不等于0。怎么了?
问题内容: 我已经研究了很多关于Java线程的教程,但是找不到答案。 我的问题是:如何同时运行两个独立的线程? 我的情况是:我有两个任务; 保存一些数据到数据库 在移动设备上发送推送通知。 由于这两个任务是独立的,因此我想同时执行它们。 我尝试使用具有两个线程的线程池,但是问题是数据库任务很快完成,但是发送推送通知需要一些时间。 因此,当一个任务完成而另一个任务仍未完成时,它将引发异常。 我的代码
我不想允许相同类型(相同存储库)的两个作业在同一节点上并行运行。 如何在Jenkinsfile中使用groovy做到这一点?
我搜索过相同的内容,但面临失败。是否有其他工具可以有效地用于在多个节点上运行脚本?