如何设置dask分布式工作器的日志记录?

时间:2017-01-05 00:00:45

标签: dask

升级分发到版本1.15.0的dask后,我的日志记录停止了工作。

我已经使用logging.config.dictConfig来初始化python日志工具,之前这些设置已传播给所有工作者。但升级后它不再起作用了。

如果我在每个日志调用之前对每个工作人员进行dictConfig工作,但它不是一个合适的解决方案。

所以问题是如何在我的计算图开始执行之前初始化每个worker的登录,并且每个worker只执行一次?

更新

这个黑客工作是一个虚拟的例子,但对我的系统没有任何影响:

def init_logging():
   # logging initializing happens here
   ...

client = distributed.Client()
client.map(lambda _: init_logging, client.ncores())

更新2:

在深入了解文档后,解决了这个问题:

client.run(init_logging)

现在的问题是:这是解决这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:4)

从版本1.15.0开始,我们现在从一个干净的流程中派遣工人,因此在调用Client()之前对流程所做的更改不会影响派生工作者。有关详细信息,请在此处搜索forkserverhttps://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods

您使用Client.run的解决方案对我来说很好看。 Client.run目前(从版本1.15.0开始)是在所有当前活动的工作程序上调用函数的最佳方法。

分布式系统

值得注意的是,您可以在一台计算机上设置从同一进程分叉的客户端。您在上面使用的技巧将无法在分布式设置中使用。如果有人问到如何在集群环境中使用Dask处理日志记录,我会添加此笔记。

通常Dask不会移动日志。相反,通常用于启动Dask的任何机制都会处理此问题。像SGE / SLURM / Torque / PBS这样的作业调度程序都可以执行此操作。像YARN / Mesos / Marathon / Kubernetes这样的云系统都是这样做的。 dask-ssh工具执行此操作。