Dask Distributed似乎在compute()期间没有传递请求的操作

时间:2017-06-28 00:29:55

标签: python distributed dask

在下面的操作(改编自Dask DataFrame API文档)中,如果我没有附加到调度程序(保留指定客户端变量的行已注释掉),操作将按预期成功完成。

from dask.distributed import Client
import dask.dataframe as dd
import pandas as pd

connection_loc = 'foobar.net:8786'
# client = Client(connection_loc)

df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [1., 2., 3., 4., 5.]})
ddf = dd.from_pandas(df, npartitions=2)
foo = ddf.map_overlap(lambda df: df.rolling(2).sum(), 2, 0).compute()

取消注释同一行并分配客户端连接的那一刻,发生以下错误:TypeError: unorderable types: list() >= int()(有关详细信息,请参阅完整回溯)。

检查回溯,我可以看到它试图反序列化的字节串不是我想要的反序列化(参见完全回溯distributed.protocol.pickle - INFO - Failed to deserialize中的第一行)。

我完全停止并重新启动运行worker和scheduler的远程容器无济于事。我也使用client.restart()但没有运气。知道为什么这个其他任务被传递给worker并抛出这个错误?让Dask停止这样做的任何解决方案?

完整追溯:

dask_worker_1     | distributed.protocol.pickle - INFO - Failed to deserialize b"\x80\x04\x95+\x01\x00\x00\x00\x00\x00\x00(\x8c\x17cloudpickle.cloudpickle\x94\x8c\x0e_fill_function\x94\x93\x94(h\x00\x8c\x0f_make_skel_func\x94\x93\x94h\x00\x8c\r_builtin_type\x94\x93\x94\x8c\x08CodeType\x94\x85\x94R\x94(K\x01K\x00K\x01K\x02KCC\x0e|\x00j\x00d\x01\x83\x01j\x01\x83\x00S\x00\x94NK\x02\x86\x94\x8c\x07rolling\x94\x8c\x03sum\x94\x86\x94\x8c\x02df\x94\x85\x94\x8c\x1fdask_method/dask_dist_matrix.py\x94\x8c\x08<lambda>\x94K\rC\x00\x94))t\x94R\x94]\x94}\x94\x87\x94R\x94}\x94N}\x94tRN\x8c3('from_pandas-ddc065084280667dd51853b144bdd4e8', 0)\x94NK\x02K\x00)}\x94t\x94."
dask_worker_1     | Traceback (most recent call last):
dask_worker_1     |   File "/usr/local/lib/python3.5/site-packages/distributed/protocol/pickle.py", line 59, in loads
dask_worker_1     |     return pickle.loads(x)
dask_worker_1     |   File "/usr/local/lib/python3.5/site-packages/cloudpickle/cloudpickle.py", line 935, in _make_skel_func
dask_worker_1     |     if cell_count >= 0 else
dask_worker_1     | TypeError: unorderable types: list() >= int()
dask_worker_1     | distributed.worker - WARNING - Could not deserialize task
dask_worker_1     | Traceback (most recent call last):
dask_worker_1     |   File "/usr/local/lib/python3.5/site-packages/distributed/worker.py", line 1113, in add_task
dask_worker_1     |     self.tasks[key] = _deserialize(function, args, kwargs, task)
dask_worker_1     |   File "/usr/local/lib/python3.5/site-packages/distributed/worker.py", line 573, in _deserialize
dask_worker_1     |     args = pickle.loads(args)
dask_worker_1     |   File "/usr/local/lib/python3.5/site-packages/distributed/protocol/pickle.py", line 59, in loads
dask_worker_1     |     return pickle.loads(x)
dask_worker_1     |   File "/usr/local/lib/python3.5/site-packages/cloudpickle/cloudpickle.py", line 935, in _make_skel_func
dask_worker_1     |     if cell_count >= 0 else
dask_worker_1     | TypeError: unorderable types: list() >= int()

Dask:0.15.0 分布式:1.17.1 操作系统:Ubuntu 16.04.2 LTS

2 个答案:

答案 0 :(得分:2)

我怀疑你的工作人员和客户之间的cloudpickle版本不匹配。您必须确保所有工作人员和客户都具有相同的软件设置。您可以尝试以下命令来提供帮助:

client.get_versions(check=True)

我不认为这包括dask.distributed版本1.17.1中的cloudpickle,但应该在所有后续版本中。 (它现在在主人身上工作)

答案 1 :(得分:0)

正如另一个答案所提到的,这几乎肯定是软件版本中的不匹配。我遇到了同样的问题。

我做了几件事让这一切再次奏效。我使用的是dask_ec2,所以我会在这里包含这些更改,但我不知道你是如何设置群集的。

首先,当我在本地使用ubuntu 16.04时,我想如果分布式服务器具有相同的版本,则更有可能拥有相同的库等,但这有一个问题(参见https://github.com/dask/dask-ec2/issues/98)。摘要:我修改了dask_ec2/salt.py,将其设置为在cherrypy==3.2.3方法中下载__install_salt_rest_api(有关详细信息,请参阅链接问题)。

其次,我将dask_ec2设置为使用较新版本的Anaconda。在 dask_ec2/formulas/salt/conda/settings.sls,将download_url行更改为:

{% set download_url = 'https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh' %}

{% set download_url = 'https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh' %}

第三,我在自己的计算机上运行了更新,以确保我自己的库是最新的:

E.g。来自:Upgrading all packages with pip

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

conda update --all

我终于重新启动了整个批次,并且工作正常。