IPython parallel docs提到:
c = Client(profile='myprofile')
或
c = Client('/path/to/my/ipcontroller-client.json')
用于本地ipengines(IIUC)和
c = Client('/path/to/my/ipcontroller-client.json', sshserver='me@myhub.example.com')
如果我的ipengines在另一台服务器上。
但是,我需要做些什么才能让IPython并行控制器从本地节点管理8个ipengine,从远程节点管理8个ipengine,通过SSH连接?
或者如果没有全面的HDFS,Hadoop等,这是不可能的吗?
我的目标是拥有一个客户端(或控制器?)接口,我可以以负载均衡的方式发送一堆计算,我不关心运行的位置和时间。
答案 0 :(得分:3)
客户端的sshserver arg仅适用于无法从客户端直接访问Controller的情况(例如笔记本电脑上的客户端,远程网络上防火墙后面的控制器)。客户无需了解或关注发动机的位置。此外,仅当机器彼此不可访问时才需要ssh隧道。为了简单起见,我假设你实际上并不需要ssh隧道。
最简单的情况:
host1
是您要运行Controller,Client和5引擎的地方host2
是同一局域网上的另一台计算机,您要在其中启动8个引擎启动控制器,监听所有接口(因此LAN上其他地方的引擎可以连接)
[host1] ipcontroller --ip=*
(跳过共享文件系统)将连接文件发送到host2
[host1] rsync -av $HOME/.ipython/profile_default/security/ host2:.ipython/profile_default/security/
在host1上启动引擎
[host1] ipengine
# or start multiple engines at once:
[host1] ipcluster engines -n 5
在host2上启动引擎
[host2] ipengine
# or start multiple engines at once:
[host2] ipcluster engines -n 8
在host1上打开一个客户端:
[host1] ipython
In[1]: from IPython import parallel
In[2]: rc = parallel.Client()
您现在应该可以访问两台计算机上的引擎。
您也可以通过配置表达所有这些。要初始化配置文件:
[host1] ipython profile create --parallel
告诉ipcontroller监听ipcontroller_config.py
中的所有接口:
c.HubFactory.ip = '*'
告诉ipcluster在ipcluster_config.py
的host1和host2上启动带ssh的引擎:
c.IPClusterEngines.engine_launcher_class = 'SSH'
c.SSHEngineSetLauncher.engines = {
'host1': 5,
'host2': 8,
}
使用ipcluster
启动所有内容:
[host1] ipcluster start
SSH启动程序将负责将连接文件复制到远程引擎。
如果确实需要ssh隧道,可以指定
c.IPControllerApp.ssh_server = u'host1'
ipcontroller_config.py
中的。 IPython应该能够判断引擎或客户端是否在host1
上运行,并且如果没有必要则跳过隧道。如果它无法解决这个问题,您可以手动指定应该使用ssh服务器的位置并将其保留在配置之外,或者将其放在config中并手动指定不应该使用ssh服务器,以更方便的方式为您服务