You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dask分布式集群读取CSV文件时工作节点报FileNotFoundError的问题排查与解决咨询

Dask分布式集群读取CSV文件时工作节点报FileNotFoundError的问题排查与解决咨询

看起来你遇到了Dask分布式集群里非常常见的文件访问问题——工作节点(Worker)找不到主节点(Master)上的CSV文件。别担心,这本质是因为Dask Worker会尝试在自身本地文件系统读取你指定的路径,而不是直接从Master拉取文件,咱们一步步来解决这个问题:

核心问题分析

你在Master节点的/var/shared/job_skills.csv是本地路径,但Worker节点的本地文件系统里并没有这个路径(或者路径下没有对应文件),所以当Dask把读取任务分发到Worker时,就会抛出FileNotFoundError。另外注意到你脚本里写的是/var/shared/foo.csv,但实际文件是job_skills.csv,这可能也是一个需要先修正的笔误!

解决方案(按推荐优先级排序)

1. 使用共享存储(最推荐,适合大文件/长期集群)

这是生产环境中最常用的方案:把CSV文件放在所有节点都能访问的共享存储上,确保Master和Worker的相同路径挂载了同一个共享目录。

  • 步骤:
    • 在Master节点配置共享存储(比如NFS、GlusterFS),将job_skills.csv放入共享目录/var/shared
    • 在每个Worker节点上,将Master的共享目录挂载到本地的/var/shared(路径要和Master完全一致)
    • 在Worker节点上运行ls /var/shared/job_skills.csv,确认能看到文件后再执行你的脚本

2. 用Client上传文件到所有Worker(适合小文件快速测试)

如果只是临时测试小文件,可以用Dask Client的upload_file方法,把文件直接传到所有Worker的本地临时目录:

import dask
import dask.dataframe as dd
from dask.distributed import Client

dask.config.set({"dataframe.convert-string": False})

client = Client("192.168.33.10:8786")
# 上传Master上的文件到所有Worker节点
client.upload_file("/var/shared/job_skills.csv")
# 上传后直接用文件名访问,不需要绝对路径
df = dd.read_csv("job_skills.csv")

df['job_skills'] = df['job_skills'].fillna('')
df = df["job_skills"].str.split(',').explode().str.strip()
grouped = df.value_counts().compute()

print(grouped)
  • 注意:这个方法会在每个Worker上存一份文件副本,大文件会占用大量网络带宽和Worker磁盘空间,不适合生产场景。

3. 使用网络共享路径直接访问

如果不想挂载共享目录,可以直接用共享协议的网络路径访问文件(比如NFS/SMB的网络地址)。例如,如果Master的/var/shared是NFS共享,Worker可以用如下路径读取:

df = dd.read_csv("nfs://192.168.33.10/var/shared/job_skills.csv")
  • 注意:不同共享协议的路径格式不同,需要根据你使用的协议调整,且性能可能不如挂载共享目录稳定。

额外排查点

  • 权限检查:Worker进程的运行用户是否有访问共享文件的权限?比如如果文件是root权限,但Worker用普通用户运行,会因权限不足报错。
  • 路径一致性:确保所有节点的文件路径完全一致,包括大小写(Linux系统路径区分大小写)。

备注:内容来源于stack exchange,提问作者Mohamed Amine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:53:11