如何从Dask-Yarn作业中捕获工人的日志?

时间:2019-08-23 21:14:13

标签: dask

我尝试在~/.config/dask/distributed.yaml~/.config/dask/yarn.yaml中使用以下内容,

logging-file-config: "/path/to/config.ini"

logging:
  version: 1
  disable_existing_loggers: false

  root:
    level: INFO
    handlers: [consoleHandler]

  handlers:
    consoleHandler:
      class: logging.StreamHandler
      level: INFO
      formatter: sample_formatter
      stream: ext://sys.stderr

  formatters:
    sample_formatter:
      format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

然后在我的函数中得到工作人员的评估:

import logging
from distributed.worker import logger
import dask
from dask.distributed import Client
from dask_yarn import YarnCluster

log = logging.getLogger(__name__)

@dask.delayed
def worker_func(args):
    logger.info("This will show up in the worker logs")
    log.info("This does not show up in worker logs")
    return

if __name__ == "__main__":
    dag_1 = {'worker_func': (worker_func, arg_1)}
    tasks = dask.get(dag_1, 'load-1')

    log.info("This also shows up in logs, and custom formatted)
    cluster = YarnCluster()
    client = Client(cluster)
    dask.compute(tasks)

当我尝试使用以下方法查看纱线记录时:

yarn logs -applicationId {application_id}

我没有看到log.info内部worker_func的日志,但确实看到了distributed.worker.logger以及控制台上该函数外部的日志。我也尝试使用client.get_worker_logs(),但是返回了一个空字典。有没有办法查看从工作人员那里求值的函数内部的自定义日志?

1 个答案:

答案 0 :(得分:1)

这个问题有很多事情要做,所以我将回答“如何为轻纱工人配置日志记录”,并希望其他所有内容都能通过回答而变得清楚。

Dask的配置系统已本地加载到您从中启动dask群集的计算机上(通常是边缘节点)。此配置不会自动分配给工作人员,您需要自己负责。您在这里有一些选择:

  • 在每个节点的/etc/dask/中进行管理/ IT配置,这将影响所有用户。
  • 打包环境中的捆绑包配置。 Dask将从{prefix}/etc/dask/加载配置,其中prefixsys.prefix

例如,如果您在/path/to/environment拥有conda环境,则可以执行以下操作以捆绑配置

# Create the configuration directory in the environment
mkdir -p /path/to/environment/etc/dask/
# Add your configuration to this directory
mv config.yaml /path/to/environment/etc/dask/config.yaml
# Package the environment
conda pack -p /path/to/environment -o environment.tar.gz

config.yaml中设置的任何配置值现在将在所有工作节点上可用。设置一些日志记录配置的示例配置文件为:

logging:
  version: 1

  root:
    level: INFO
    handlers: [consoleHandler]

  handlers:
    consoleHandler:
      class: logging.StreamHandler
      level: INFO
      formatter: sample_formatter
      stream: ext://sys.stderr

  formatters:
    sample_formatter:
      format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

使用YARN cli可以检索完成的dask-yarn应用程序中的日志

yarn logs -applicationId <application-id>
可以使用client.get_worker_logs()来检索

正在运行的 dask-yarn应用程序的日志。请注意,这些日志将仅包含写入distributed.worker记录器的记录。您无法写自己的记录器,而使它们出现在client.get_worker_logs()的输出中。要写入此记录器,请通过

获取
import logging
logger = logging.getLogger("distributed.worker")
logger.info("Writing with the worker logger")

任何经过适当配置以登录到stdoutstderr的记录器都会出现在通过yarn CLI访问的日志中,但是{{1}仅distributed.worker记录器输出可用。 }}。


旁注

  

我尝试在〜/ .config / dask / distributed.yaml和〜/ .config / dask / yarn.yaml中使用以下内容

配置文件的名称无关紧要,dask会将所有get_worker_logs()文件加载到所有配置目录中并合并其内容。有关更多信息,请阅读the configuration docs