从笔记本启动IPython集群并延迟执行
我们的SGE集群设置要求控制器和引擎启动之间有一个延迟。如果没有这个延迟,有些服务器会使用“旧的” ipcontroller-client.json
文件,试图连接到之前的(而且已经不在运行的)控制器。这是NFS的一个“特性”,所以为了修复这个问题,我在ipcluster_config.py文件中设置了 c.IPClusterStart.delay = 30
,这样一切就正常了。控制器被提交到SGE,有足够的时间启动并写入它的json文件,然后引擎可以正确地连接到新启动的控制器。不过,我也想从笔记本启动集群。不幸的是,似乎这个超时没有被使用,控制器和引擎同时启动(通过 watch qstat
可以看到),有些引擎连接上了(因为它们从json文件中获取了新的设置),而有些则没有(因为NFS的问题)。
我在笔记本上运行了一个strace,看到它使用了 sge_controller
和 sge_engines
脚本(当你按下启动时,笔记本会创建这些脚本)来启动这些进程。
我在想这里有没有办法也实现一个延迟。它以正确的方式(SGE)启动控制器和引擎,所以我知道它在读取 ipcluster_config.py
文件。
我在谷歌上搜索过,也在这个网站上查找过,但没有找到解决办法。希望有人能帮我解释一下这个行为的更深层次的工作原理。
谢谢,
Chris
1 个回答
好吧,这可能对提问者来说有点晚,但希望能帮助到其他人。
如果是超时的问题,可以把 c.EngineFactory.timeout
和 c.IPEngineApp.wait_for_url_file
的时间设置得更长一些。
如果是第一次运行后出现的失败,可能是因为一些安全文件还留在那儿,这些文件需要被删除(比如 ipcontroller-engine.json
和 ipcontroller-client.json
)。你可以用 IPython.utils.path.get_security_file
来找到这些文件的完整路径。为了让这个过程更简单,可以把删除这些文件的步骤加到同一个配置文件的开头,也就是 ipcluster_config.py
。
光是这些改动就足够让我顺利地用笔记本启动集群了。
如果这些方法都不能解决问题,还有其他一些建议(http://mail.scipy.org/pipermail/ipython-user/2011-November/008741.html)。