本地Jupyter连接远程Dask集群如何读取远程机器存储的CSV文件?
问题原因
你遇到的报错本质是dd.read_csv会优先在本地(你运行Jupyter的机器)执行路径扫描、采样推断元数据的前置逻辑,而你的本地机器没有对应路径的文件,路径扫描返回空列表,才触发了取paths[0]的索引错误,并不是worker节点找不到文件的问题。
可行解决方案
方案1:用delayed包装读取逻辑(最便捷)
直接把pandas读文件的逻辑包装成延迟任务,提交到远程worker执行,再转成Dask DataFrame,本地不需要访问远程文件:
import dask.dataframe as dd from dask.distributed import Client, delayed import pandas as pd client = Client('remote-ip:8786') @delayed def remote_read(path): return pd.read_csv( path, header=None, dtype=object ) # 单文件写法 ddf = dd.from_delayed(remote_read('/absolute/path/to/remote-machine-file.csv')) # 多文件的话可以批量生成delayed对象再传入 # delayed_list = [remote_read(f'file_{i}.csv') for i in range(10)] # ddf = dd.from_delayed(delayed_list)
注意:文件路径要写远程机器上的绝对路径,避免相对路径找不到
方案2:本地挂载远程目录
用sshfs把远程机器存文件的目录挂载到本地完全相同的路径下,这样本地的路径扫描逻辑能读到文件元数据,worker也能正常读取远程本地的文件。
方案3:走SSH协议直接读远程文件
你也可以直接给dd.read_csv传SSH格式的路径,让Dask通过SSH协议直接读取远程文件,不需要单独挂载:
ddf = dd.read_csv( 'ssh://<远程用户名>@<remote-ip>//<远程文件绝对路径>', header=None, assume_missing=True, dtype=object, storage_options={ "key_filename": "/本地/ssh/私钥/路径", # 如果用密码认证就传 "password": "你的密码",不推荐明文写密码 } )
内容的提问来源于stack exchange,提问作者Mrityunjay
相关产品推荐
相关产品推荐

