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,确认能看到文件后再执行你的脚本
- 在Master节点配置共享存储(比如NFS、GlusterFS),将
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
相关产品推荐
相关产品推荐

