Dask分布式执行计算而不返回数据

时间:2018-10-07 19:40:34

标签: dask dask-distributed

我有一个动态的Dask Kubernetes集群。 我想将Gcloud存储中的35个实木复合地板文件(约1.2GB)加载到Dask Dataframe中,然后用apply()处理并将结果保存到实木复合地板文件中并保存到Gcloud。

在从Gcloud存储中加载文件的过程中,群集内存使用量增加到大约3-4GB。然后,工作人员(每个工作人员都有2GB的RAM)被终止/重新启动,并且一些任务丢失了, 因此集群开始在一个圆圈内计算相同的事物。 我删除了apply()操作,仅保留read_parquet()进行测试 如果我的自定义代码引起了麻烦,但是即使仅执行一次read_parquet()操作,问题仍然相同。这是一个代码:

client = Client('<ip>:8786')
client.restart()

def command():
    client = get_client()
    df = dd.read_parquet('gcs://<bucket>/files/name_*.parquet', storage_options={'token':'cloud'}, engine='fastparquet')
    df = df.compute()

x = client.submit(command)
x.result()

注意:我正在提交一个命令功能来运行所有必需的命令,以避免集群内部gcsfs身份验证出现问题

经过一番调查,我了解到问题可能出在.compute()上,该问题将所有数据返回到进程,但是此进程(我的命令功能)正在某个工作程序上运行。因此,工作人员没有足够的RAM,崩溃并丢失了所有计算出的任务,从而触发了任务重新运行。

我的目标是:

  • 从镶木地板文件中读取
  • 使用apply()
  • 执行一些计算
  • 甚至没有从集群返回数据,也可以使用拼花格式将其写回到Gcloud存储。

因此,我只是想将数据保留在群集中而不要返回它。只需在其他地方计算并保存数据即可。

在阅读Dask分布式文档后,我发现了client.persist()/compute().scatter()方法。它们看起来像我所需要的,但是我不太了解如何使用它们。

请为我的示例提供client.persist()client.compute()方法帮助我 或建议另一种方法?非常感谢你!

黄昏版本:0.19.1

Dask分布式版本:1.23.1

Python版本:3.5.1

1 个答案:

答案 0 :(得分:1)

df = dd.read_parquet('gcs://<bucket>/files/name_*.parquet', storage_options={'token':'cloud'}, engine='fastparquet')
df = df.compute()  # this triggers computations, but brings all of the data to one machine and creates a Pandas dataframe

df = df.persist()  # this triggers computations, but keeps all of the data in multiple pandas dataframes spread across multiple machines