Dask-如何取消和重新提交已暂停的任务?

时间:2019-11-13 14:56:45

标签: python-3.x dask dask-distributed dask-delayed fastparquet

我经常遇到一个问题,Dask在几个任务上随机停顿,通常与从网络上其他节点读取数据有关(下面有更多详细信息)。在运行脚本几个小时之后,可能会发生这种情况。它会无限期地以如下所示的形式挂起(否则,此循环将花费几秒钟的时间):

enter image description here

在这种情况下,我看到只有少数停滞的进程,并且所有进程都在一个特定节点(192.168.0.228)上: enter image description here

此节点上的每个工作程序都停在了几个read_parquet任务上:

enter image description here

这是使用以下代码调用的,并且正在使用fastparquet:

ddf = dd.read_parquet(file_path, columns=['col1', 'col2'], index=False, gather_statistics=False)

我的集群正在运行Ubuntu 19.04和Dask和Distributed的所有最新版本(截至11/12)以及所需的软件包(例如,龙卷风,fsspec,fastparquet等)

.228节点尝试访问的数据位于群集中的另一个节点上。 .228节点通过CIFS文件共享访问数据。我在运行脚本的同一节点上运行Dask调度程序(不同于.228节点和数据存储节点)。该脚本使用Paramiko通过SSH将工作程序连接到调度程序:

ssh_client = paramiko.SSHClient()
stdin, stdout, stderr = ssh_client.exec_command('sudo dask-worker ' +
                                                            ' --name ' + comp_name_decode +
                                                            ' --nprocs ' + str(nproc_int) +
                                                            ' --nthreads 10 ' +
                                                            self.dask_scheduler_ip, get_pty=True)  

.228节点与调度程序和数据存储节点之间的连通性看起来都很正常。 .228节点在尝试处理read_parquet任务时可能会遇到某种短暂的连接问题,但是,如果发生这种情况,.228节点到调度程序和CIFS共享的连接在此短暂时间内不会受到影响。无论如何,日志不会显示任何问题。这是来自.228节点的整个日志:

distributed.worker - INFO - Start worker at: tcp://192.168.0.228:42445

distributed.worker - INFO - Listening to: tcp://192.168.0.228:42445

distributed.worker - INFO - dashboard at: 192.168.0.228:37751

distributed.worker - INFO - Waiting to connect to: tcp://192.168.0.167:8786

distributed.worker - INFO - -------------------------------------------------

distributed.worker - INFO - Threads: 2

distributed.worker - INFO - Memory: 14.53 GB

distributed.worker - INFO - Local Directory: /home/dan/worker-50_838ig

distributed.worker - INFO - -------------------------------------------------

distributed.worker - INFO - Registered to: tcp://192.168.0.167:8786

distributed.worker - INFO - -------------------------------------------------

撇开这是Dask还是我的代码/网络中的错误,是否可以为调度程序处理的所有任务设置一般超时?或者,是否可以:

  1. 识别停滞的任务,
  2. 复制已停止的任务并将其移至其他工作人员,然后
  3. 取消已暂停的任务?

1 个答案:

答案 0 :(得分:1)

  

是否可以为调度程序处理的所有任务设置通用超时?

很遗憾,截至2019-11-13,答案为否。

如果任务正确失败,则可以使用client.retry(...)重试该任务,但是没有一种自动的方法可以使任务在一定时间后失败。您必须自己将其写入Python函数。不幸的是,很难在另一个线程中中断Python函数,这部分是为什么未实现此功能的原因。

如果工人倒下,则将在其他地方进行尝试。然而,从您所说的看来,一切都健康,只是任务本身可能永远存在。不幸的是,很难将其识别为失败案例。