Kubernetes 上的 Dask 工作人员找不到 csv 文件



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

一切都部署得很好,我可以访问JupyterLab。然后,我创建了一个笔记本,并从Google Cloud Storage bucket下载了一个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 客户端,以便我可以监控计算分析:

from dask.distributed import Client, config
client = Client()

到目前为止一切顺利,直到我尝试与数据框进行交互。 F.e. 当我尝试执行df.head()时,出现错误:

[Errno 2] 没有这样的文件或目录:"/home/jovyan/data/test-file.csv"

为什么其他工作线程找不到数据帧?我认为数据帧是在所有工人的记忆中共享的。

注意:起初我在没有 Dask 客户端的情况下使用 df.head() 并且有效,但我没有看到任何诊断,所以我添加了client = Client()

您已将文件下载到运行客户端的节点,但 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

最新更新