我可以使用从Dask / Distributed中的.py文件导入的功能吗?
我对序列化和导入有疑问。
- 功能应该有自己的进口吗?就像我看过的PySpark
-
以下只是明显的错误吗?是否
mod.py
需要是conda / pip软件包?mod.py
被写入共享文件系统。In [1]: from distributed import Executor
In [2]: e = Executor(‘127.0.0.1:8786’)
In [3]: e
Out[3]:In [4]: import socket
In [5]: e.run(socket.gethostname)
Out[5]: {‘172.20.12.7:53405’: ‘n1015’, ‘172.20.12.8:53779’: ‘n1016’}In [6]: %%file mod.py
…: def hostname():
…: return ‘the hostname’
…:
Overwriting mod.pyIn [7]: import mod
In [8]: mod.hostname()
Out[8]: ‘the hostname’In [9]: e.run(mod.hostname)
distributed.utils - ERROR - No module named ‘mod’
-
快速回答
将您的mod.py文件上传到所有工作人员。您可以使用用于设置dask.distributed的任何机制来执行此操作,也可以使用upload_file方法
e.upload_file('mod.py')
另外,如果您的函数是在IPython中创建的,而不是作为模块的一部分,则它将毫无问题地发送出去。
长答案
所有这些都与如何在Python中序列化函数有关。模块中的功能按其模块名称和功能名称进行序列化
In [1]: from math import sin In [2]: import pickle In [3]: pickle.dumps(sin) Out[3]: b'\x80\x03cmath\nsin\nq\x00.'
因此,如果客户端计算机想要引用该
math.sin
函数,它将沿着该字节字符串(您会注意到'math'
并'sin'
在其中将其埋入其他字节中)发送给工作机。工作人员看了看这个字节串,然后说:“好吧,我想要的功能在这样的模块中,让我继续在本地文件系统中查找它。如果该模块不存在,则会引发错误。
,就像您上面收到的一样。对于动态创建的函数(在IPython中创建的函数),它使用完全不同的方法,将所有代码捆绑在一起。这种方法通常效果很好。
一般来说,Dask假定工作人员和客户端都具有相同的软件环境。通常,这主要由使用Docker等其他工具来设置您的集群的人来处理。
upload_file
当您拥有文件或脚本的更新频率更高时,可以使用诸如此类的方法来填补空白。