借助Dask文档http://docs.dask.org/en/latest/setup/kubernetes.html,我使用Helm在Kubernetes集群上设置了Dask和JupyterHub。
一切都部署良好,我可以访问JupyterLab。然后,我创建了一个笔记本,并从Google Cloud Storage存储桶下载了csv文件:
storage_client = storage.Client.from_service_account_json(CREDENTIALS)
bucket = storage_client.get_bucket(BUCKET)
download_blob(bucket, file="test-file", destination_dir="data/")
我读入了csv文件:
import dask.dataframe as dd
df = dd.read_csv("/home/jovyan/data/*.csv")
我初始化Dask Client,以便可以监视计算分析:
from dask.distributed import Client, config
client = Client()
到目前为止,一切都很好,直到我尝试与数据框进行交互。 F.e.当我尝试执行df.head()
时收到错误消息:
[Errno 2]没有这样的文件或目录:'/home/jovyan/data/test-file.csv'
为什么其他工作人员找不到数据框?我以为该数据框是在所有工作人员的内存之间共享的。
注意:最初,我使用df.head()
时没有安装Dask Client,并且可以使用,但是我没有看到任何诊断信息,因此我添加了client = Client()
。
答案 0 :(得分:1)
您已将文件下载到运行客户端的节点上,但是kubernetes中其他节点上的worker无法访问该文件系统,因此无法加载该文件。
这里最简单的解决方案是使用Dask的本机功能与GCS进行对话。您完全不需要数据的本地副本。您应该安装gcsfs
,然后尝试:
df = dd.read_csv("gcs://<BUCKET>/test-file.csv", storage_options={'token': CREDENTIALS})
(或者您可能希望通过其他更安全的方式将凭据分发给您的员工)。
如果您需要想要数据的本地副本(例如,某些加载程序无法利用远程文件系统),那么您将需要在客户端和工作人员之间共享文件系统您的Dask集群中,需要一些kubernetes-foo才能实现。
更多信息:http://docs.dask.org/en/latest/remote-data-services.html