Kubernetes 上的 Dask worker 找不到 csv 文件

Dask workers on Kubernetes cannot find csv file

我在 Dask 文档的帮助下使用 Helm 在 Kubernetes 集群上设置了 Dask 和 JupyterHub:http://docs.dask.org/en/latest/setup/kubernetes.html

部署一切正常,我可以访问 JupyterLab。然后我创建了一个笔记本并从 Google 云存储桶下载了一个 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] No such file or directory: '/home/jovyan/data/test-file.csv'

为什么其他worker找不到DataFrame?我以为DataFrame是所有worker内存共享的

注意:起初我在没有 Dask Client 的情况下使用 df.head() 并且可以正常工作,但我没有看到任何诊断信息,所以我添加了 client = Client()

您已将文件下载到您的客户端 运行 所在的节点,但 kubernetes 中其他节点上的工作人员无法访问该文件系统,因此无法加载该文件。

这里最简单的解决方案是使用 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