关于gnu parallel:GnuParallel:在集群上并行化脚本,脚本将文件写入主节点

 2020-12-30 

GnuParallel: Parallelizing a script over a cluster, script writes files to the Master node

我有一个简单的bash脚本,它将文本文件中的目录名称列表作为输入。它一步一步地遍历这些目录,将pwd的输出复制到文件中,然后将该文件移动到结果目录中。我可以使用Gnuparallel在我的4核心机器上并行化此脚本。 bash脚本(myScript.sh)如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

par_func (){
    name=$1
    cd /home/zahaib/parentFolder/$name
    pwd > $name.txt
    mv $name.txt /home/zahaib/result/
    cd /home/zahaib/parentFolder
    }

export -f par_func
parallel -a /home/zahaib/folderList.txt -j 10 par_func

现在我想在集群上并行化相同的脚本,所有辅助节点都已安装主节点的主目录,因此我可以看到在所有工作程序节点上ls /home/zahaib/的输出。

我尝试使用--env导出par_func。我还在workerList.txt文件中有一个工作节点列表。我最初的想法是通过使用以下命令更改上面脚本中的最后一行来调用parallel

1
parallel -vv --env par_func --slf /home/zahaib/workerList.txt -a /home/zahaib/folderList.txt -j 10 par_func

但是,这似乎不起作用,Master节点上的外壳在我执行后就挂起了./myScript.sh。我在这里丢失了什么?

我的folderList.txt的内容如下:

1
2
3
4
5
6
7
docs
dnload
driver
pics
music
.
.

和我的workerList.txt的内容如下:

1
2
3
2//usr/bin/ssh zahaib@node-1
2//usr/bin/ssh zahaib@node-2
2//usr/bin/ssh zahaib@node-3

根据您的描述,您在做正确的事情,因此您可能遇到了错误。

尝试最小化workerList.txt和folderList.txt,然后运行:

1
parallel -D ...

(并签出--result选项,这可能对您有用)。