定义了块大小时,任务袋陷入处理,仅在未定义时使用一个worker

问题描述 投票:0回答:1

我正在尝试使用Dask在本地处理单个大(1TB)json文件。该文件每行有一个对象。当我未在read_text函数中指定块大小时,代码可以完美运行,但只能在一个工作程序上运行。然后仅创建一个分区,并且在仪表板中只能看到一个任务。如果我确实指定blocksize,则所有工作人员都会获得任务,但他们永远不会继续进行处理(至少不是在12小时之内)。怎么了?我如何让所有工人真正地工作?

代码如下:

import dask.bag as db
from dask.distributed import Client, LocalCluster
cluster = LocalCluster(n_workers=4, 
                threads_per_worker=2,
                memory_limit='2GB')

client = Client(cluster)

db.read_text('./data/uncompressed/latest-all.json', blocksize=1e8)\
    .map(lambda obj: obj[:-2])\
    .map(parse_json)\
    .map(prune)\
    .filter(lambda obj: obj != None)\
    .map(json.dumps)\
    .to_textfiles('./data/proc/*.json')

parse_jsonprune都是纯Python函数,没有IO。

以下是定义块大小时的仪表板的片段:dask dashboard

python jupyter etl dask dask-distributed
1个回答
0
投票

我的第一个猜测是它们正在工作,但是您的功能非常慢。您可以通过...]查看您的工人在做什么

  1. 查看个人资料页面以查看工作人员在花什么时间
  2. 查看信息页面,导航到任何工作人员,然后单击“呼叫堆栈”按钮以查看他们的工作情况
  3. 您也可以考虑使用较小的块,以查看是否有助于使事情更快地移动。

© www.soinside.com 2019 - 2024. All rights reserved.