用任务分发系统Gearman来加速你的计算任务(续)

· Read in about 1 min · (107 Words)

这是上一篇《用任务分发系统Gearman来加速你的计算任务》的续。

昨天处理一个个可并行化的的CPU密集型计算任务:每个任务里面包括一些有先后关系的子任务,其中一些任务可以并行执行,其后的任务则必须在它们都执行完之后才能继续。工作流如下所示:

                    |-> subjob2 |  
JOB1:    subjob1 -> |-> subjob3 | -> subjob5 -> subjob6
                    |-> subjob4 |

                    |-> subjob2 |  
JOB2:    subjob1 -> |-> subjob3 | -> subjob5 -> subjob6
                    |-> subjob4 |

                    |-> subjob2 |  
JOB3:    subjob1 -> |-> subjob3 | -> subjob5 -> subjob6
                    |-> subjob4 |

困扰于大段的shell命令,写了一个很实用的脚本crun执行部分可并行化的链式任务,即执行一个JOB。

由于JOB里面的subjob都是CPU密集型的,那么多个JOB最好用计算机集群来实现并行化。昨天很脑残忘了还有Gearman了,自己写任务分发模块,结果到今天早上都没搞定。最后用Gearman一个小时即搞定。

新的经验:

  • 先顺序执行所有任务。说不定程序没写完,任务已经跑完了。
  • 上篇提到的“用管理软件自动部署server和workers”在这次体现出了极大的便利性。
  • Worker里面的任务前台运行程序,方便检测任务完成状态。
  • Worker出错后不要退出,应该向Client返回状态。
  • 我们的集群是各计算节点共享存储系统,对于某些IO密集型的任务,IO就成了瓶颈。

利用”done”文件(受lock文件启发)检测后台运行的任务是否完成:在任务命令前面加删除done文件的命令,后面加写done文件的命令,运行后通过持续检测done文件是否存在来确定后台任务是否完成。Shell实例如下

if [ -s .done ]; then rm .done; fi;    echo 'job starts' &&  sleep 5 && echo 'job ends' &&  echo 'done' > .done &  while [[ true ]]; do if [ -s .done ]; then echo 'it finished!'; break; fi; sleep 1; done;

其它:

  • 顺序执行一些命令用&&连接,如果太多则用crun吧。
  • 引号和双引号最多嵌套两层,应避免嵌套太多命令,可把一些写入shell脚本。
  • nohup有待进一步理解。