IPython并行控制器可以都有本地和远程ipengines吗?

时间:2014-11-09 01:29:14

标签: python ipython-parallel

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等,这是不可能的吗?

我的目标是拥有一个客户端(或控制器?)接口,我可以以负载均衡的方式发送一堆计算,我不关心运行的位置和时间。

1 个答案:

答案 0 :(得分:3)

客户端的sshserver arg仅适用于无法从客户端直接访问Controller的情况(例如笔记本电脑上的客户端,远程网络上防火墙后面的控制器)。客户无需了解或关注发动机的位置。此外,仅当机器彼此不可访问时才需要ssh隧道。为了简单起见,我假设你实际上并不需要ssh隧道。

最简单的情况:

  • host1是您要运行Controller,Client和5引擎的地方
  • host2是同一局域网上的另一台计算机,您要在其中启动8个引擎

没有配置

  1. 启动控制器,监听所有接口(因此LAN上其他地方的引擎可以连接)

    [host1] ipcontroller --ip=*
    
  2. (跳过共享文件系统)将连接文件发送到host2

    [host1] rsync -av $HOME/.ipython/profile_default/security/ host2:.ipython/profile_default/security/
    
  3. 在host1上启动引擎

    [host1] ipengine
    # or start multiple engines at once:
    [host1] ipcluster engines -n 5
    
  4. 在host2上启动引擎

    [host2] ipengine
    # or start multiple engines at once:
    [host2] ipcluster engines -n 8
    
  5. 在host1上打开一个客户端:

    [host1] ipython
    In[1]: from IPython import parallel
    In[2]: rc = parallel.Client()
    
  6. 您现在应该可以访问两台计算机上的引擎。

    使用config

    您也可以通过配置表达所有这些。要初始化配置文件:

    [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服务器,以更方便的方式为您服务