我有一个动态的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()
因此,我只是想将数据保留在群集中而不要返回它。只需在其他地方计算并保存数据即可。
在阅读Dask分布式文档后,我发现了client.persist()/compute()
和.scatter()
方法。它们看起来像我所需要的,但是我不太了解如何使用它们。
请为我的示例提供client.persist()
和client.compute()
方法帮助我
或建议另一种方法?非常感谢你!
黄昏版本:0.19.1
Dask分布式版本:1.23.1
Python版本:3.5.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