将本地文件从客户端加载到dask分布式集群

时间:2017-05-05 04:53:24

标签: python python-3.x dask

一些初学者问题,但我无法在此找到相关答案..

基本上我的关于(7gb)的数据位于我的本地机器上。我在本地网络上运行了分布式集群。如何将此文件存入群集?

通常的dd.read_csv()或read_parquet()失败,因为工作人员无法在自己的环境中找到该文件。

我是否需要手动将文件传输到群集中的每个节点?

注意:由于管理员限制,我仅限于SFTP ......

2 个答案:

答案 0 :(得分:5)

两个选项

网络文件系统

正如评论中所建议的,有多种方法可以使用普通文件系统解决方案使群集中的其他计算机可以访问本地文件。如果您可以访问,这是一个很好的选择。

本地加载和分散

如果这不起作用,那么您始终可以在本地加载数据并将其分散到群集的各个工作人员。如果您的文件大于单台计算机的内存,那么您可能需要逐件执行此操作。

单程

如果一切都适合内存,那么我会正常加载数据,然后将其分散给一个工人。如果需要,您可以将其拆分并传播给其他工作人员:

import pandas
import dask.dataframe as dd
from dask.distributed import Client

client = Client('scheduler-address:8786')

df = pd.read_csv('myfile.csv')
future = client.scatter(df)  # send dataframe to one worker
ddf = dd.from_delayed([future], meta=df)  # build dask.dataframe on remote data
ddf = ddf.repartition(npartitions=20).persist()  # split
client.rebalance(ddf)  # spread around all of your workers

多位

如果你有多个小文件,那么你可以迭代加载和分散,也许在for循环中,然后从许多期货中创建一个dask.dataframe

futures = []
for fn in filenames:
    df = pd.read_csv(fn)
    future = client.scatter(df)
    futures.append(future)

ddf = dd.from_delayed(futures, meta=df)

在这种情况下,您可以跳过重新分区和重新平衡步骤

如果您有一个大文件,那么您可能需要自己进行一些拆分,或者使用pd.read_csv(..., chunksize=...)

答案 1 :(得分:0)

网络解决方案:

  • 在Windows下,它只适用于共享的forlder:dd.read_csv(“\\ server \ shared_dir”)

  • 在Unix / Linux下,它只适用于HDFS:import hdfs3,然后是hdfs.read_csv('/ server / data_dir'...)

但是如果你想同时使用Windows和Linux工作者我不知道,因为Linux下似乎不支持使用UNC的dd.read_csv()(因为文件路径'\ server \ data_dir'和hdfs.read_csv的HDFS在Windows下无法运行(导入hdfs3失败,因为Windows下不存在lib libhdfs3.so)

有没有人为Windows和Unix下的工作人员提供网络解决方案?