在下面的操作(改编自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
答案 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
我终于重新启动了整个批次,并且工作正常。