大数据混洗会导致超时

时间:2018-02-17 05:06:11

标签: dask

我试图从50个磁盘同时读取大约100kB的100000条数据记录,将它们混洗,并以磁盘速度将其写入50个输出磁盘。用Dask做这件事的好方法是什么?

我尝试使用100名工作人员创建50个队列并提交50个读取器/写入器功能(所有这些都在不同的机器上,这是使用Kubernetes)。我首先是作家,然后是读者。调度程序在大约10个读取器处停留在100%CPU,然后在添加任何更多读取器时获得超时。所以这种方法不起作用。

1 个答案:

答案 0 :(得分:0)

大多数dask操作都有1ms的开销。因此,Dask不适合放置在最里面的循环中。通常它用于较粗糙的级别,并行化许多Python函数,每个函数预计需要100毫秒。

在像你这样的情况下,我会将数据推送到像Kafka这样的共享消息系统,然后在适当时使用Dask来提取数据块。

数据传输

如果您的问题在于通过dask队列移动数据的带宽限制,那么您可以考虑在将事物放入队列之前将数据转换为dask-reference-able future。请参阅队列文档字符串的此部分:http://dask.pydata.org/en/latest/futures.html#distributed.Queue

  

队列的元素必须是Futures或msgpack可编码的数据(整数,字符串,列表,dicts)。所有数据都通过调度程序发送,因此明智的做法是不发送大型对象。要共享大型对象,请分散数据并分享未来。

所以你可能想要以下内容:

def f(queue):
    client = get_client()
    for fn in local_filenames():
        data = read(fn)
        future = client.scatter(data)
        queue.put(future)

随机

如果您只是想要随机播放数据,那么您可以使用dask.bag或dask.dataframe等来读取数据

df = dd.read_parquet(...)

然后使用set_index方法对数据进行排序

df.set_index('my-column')