我可以使用从Dask / Distributed中的.py文件导入的功能吗?

发布于 2021-01-29 17:12:59

我对序列化和导入有疑问。

  • 功能应该有自己的进口吗?就像我看过的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.py

    In [7]: import mod

    In [8]: mod.hostname()
    Out[8]: ‘the hostname’

    In [9]: e.run(mod.hostname)
    distributed.utils - ERROR - No module named ‘mod’

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    快速回答

    将您的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当您拥有文件或脚本的更新频率更高时,可以使用诸如此类的方法来填补空白。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看