python分布式计算dispy和ipyparallel

1. dispy

足够简单,支持异构,真心好用。
pip install dispy即可安装完成。
这里用一台电脑做演示。
在服务端起节点服务:
python anaconda3/bin/dispynode.py --clean

在客户端运行下面的脚本

def compute(n):
    import time, socket
    time.sleep(n)
    host = socket.gethostname()
    return (host, n)

if __name__ == '__main__':
    # executed on client only; variables created below, including modules imported,
    # are not available in job computations
    import dispy, random
    # distribute 'compute' to nodes; 'compute' does not have any dependencies (needed from client)
    cluster = dispy.JobCluster(compute,ip_addr='客户端ip地址')
    # run 'compute' with 20 random numbers on available CPUs
    jobs = []
    for i in range(20):
        job = cluster.submit(random.randint(5,20))
        job.id = i # associate an ID to identify jobs (if needed later)
        jobs.append(job)
    # cluster.wait() # waits until all jobs finish
    for job in jobs:
        host, n = job() # waits for job to finish and returns results
        print('%s executed job %s at %s with %s' % (host, job.id, job.start_time, n))
        # other fields of 'job' that may be useful:
        # job.stdout, job.stderr, job.exception, job.ip_addr, job.end_time
    cluster.print_status()  # shows which nodes executed how many jobs etc.

结果如下:
在这里插入图片描述

2 ipyparallel

大多数时候要用python做数据处理的时候仅仅是因为单机资源不够了,想把其它机器连接起来一起使用处理或是计算,或者说是要经常在不同机器上运行计算程序处理一部分需求之后手动合并。
ipyparallel是一个python包,直接安装 pip install ipyparallel 就可以了,当然要在你需要连接成集群的机器上都安装上这个工具。无论是mac还是linux,配置文件都在~/.ipython/profile_default/security/下面。在master节点上启动服务

ipcontroller --ip="*"

首先设置所有机器免密登录master节点,以及master节点免密登录所有机器。可以参考这篇:https://blog.csdn.net/snail_bing/article/details/81772982
然后用脚本将生成的ipcontroller-engine.json文件复制到所有的计算节点上,注意将第一列的ssh填写为master的ip地址
然后用脚本在每台机器上执行计算引擎,master节点也是可以启动engines:

ipcluster engines --n=8

然后启动jupyter notebook即可:

from ipyparallel import Client
c = Client()
v = c[:]
print len(v)

v.map_sync是一个同步的并行计算函数,它会把计算函数发送到不同的计算引擎上去计算,同时负责把结果返回整理出来,它的第二个参数是一个由计算函数所需要的参数组成的列表,如果参数还有,可以继续在后面增加列表,map_sync会把参数一组一组分别从每个列表相应位置取出来传递给计算函数,之后把计算结果收集成一个列表。我们的计算引擎的个数是64个,我们发的计算函数实际上由参数展开是800个,我们不需要去担心怎么分配给每个计算引擎多少任务,怎么收集计算好的结果,直接等最终结果就好了:)。

补充:网络基本知识

什么是socket

socket用类似文件管理的方式来做机器之间的数据通信,利用三元组【ip地址,协议,端口】可以进行网络间通信了。Socket通信的数据传输方式,常用的有两种:
SOCK_STREAM:数据可以准确无误地到达另一台计算机。常见的 http 协议就使用 SOCK_STREAM 传输数据;SOCK_DGRAM:表示无连接的数据传输方式。计算机只管传输数据,不作数据校验。QQ 视频聊天和语音聊天就使用 SOCK_DGRAM 传输数据,因为首先要保证通信的效率,尽量减小延迟。

TCP/IP

TCP/IP【TCP(传输控制协议)和IP(网际协议)】提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。
TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以形象的比喻为下面的对话:

[Shake 1] 套接字A:“你好,套接字B,我这里有数据要传送给你,建立连接吧。”
[Shake 2] 套接字B:“好的,我这边已准备就绪。”
[Shake 3] 套接字A:“谢谢你受理我的请求。

TCP四次握手断开连接,可以让计算机释放不再使用的资源。断开连接需要四次握手,可以形象的比喻为下面的对话:

[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
[Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
等待片刻后……
[Shake 3] 套接字B:“我准备好了,可以断开连接了。”
[Shake 4] 套接字A:“好的,谢谢合作。”

socket的通信原理图如下
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kittyzc/article/details/105731219