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

PyArrow读取远程HDFS文件失败:程序误访问本地文件系统求助

问题描述

按PyArrow官方文档配置后,成功创建pyarrow.fs.HadoopFileSystem实例,但调用open_input_file读取远程HDFS路径/my_group/data/red_wine_quality.csv时,报文件找不到错误,程序实际在本地文件系统查找,而非远程HDFS。

可能的原因及解决方案

1. 环境变量配置为空或无效

你当前设置的ARROW_LIBHDFS_DIR、HADOOP_HOME等环境变量均为空值,这会导致PyArrow无法加载HDFS依赖库,最终降级使用本地文件系统:

  • 修复方式:
    填写所有环境变量的实际路径:
    • ARROW_LIBHDFS_DIR:指向包含libhdfs.so(Linux)或hdfs.dll(Windows)的目录,通常在Hadoop安装目录的lib/native下。
    • HADOOP_HOME:Hadoop安装根目录。
    • JAVA_HOME:与Hadoop兼容的JDK安装目录。
    • CLASSPATH:可通过运行hadoop classpath命令获取完整类路径,直接赋值。

示例配置代码:

import os
import pyarrow.fs

# 替换为你的实际路径
os.environ['ARROW_LIBHDFS_DIR'] = "/opt/hadoop/lib/native"
os.environ["HADOOP_HOME"] = "/opt/hadoop"
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["CLASSPATH"] = os.popen(f"{os.environ['HADOOP_HOME']}/bin/hadoop classpath").read().strip()

2. HDFS连接参数错误

你创建HadoopFileSystem时使用"default"作为host,同时指定port=9443,存在两个问题:

  • HDFS默认RPC端口为8020或9000,9443一般是HTTPS端口,PyArrow默认用RPC协议连接,而非HTTP/HTTPS。
  • 使用"default"作为host时,PyArrow会读取core-site.xml配置,若该文件未正确设置远程HDFS地址,会连接到本地伪分布式HDFS或本地文件系统。

修复方式:
直接指定远程HDFS的RPC主机和正确端口:

hdfs_config = {
     "host" : "myhost",
     "port" : 8020,  # 替换为实际的HDFS RPC端口
     "user" : "me"
}

hdfs = pyarrow.fs.HadoopFileSystem(
    hdfs_config['host'], 
    hdfs_config['port'], 
    user=hdfs_config['user']
)

同时确保core-site.xml中的fs.defaultFS配置为远程HDFS地址(如hdfs://myhost:8020),并将该文件放在HADOOP_HOME/etc/hadoop目录下。

3. 文件路径格式问题

确保HDFS路径为绝对路径,若仍被解析为本地路径,可尝试添加hdfs://前缀:

data = "hdfs://myhost:8020/my_group/data/red_wine_quality.csv"
with hdfs.open_input_file(data) as f:
    print(f.readall())

4. 验证HDFS连接状态

读取文件前,先调用ls()方法确认连接的是远程HDFS:

# 列出远程HDFS根目录内容
print(hdfs.ls("/"))

若输出远程HDFS的目录结构,说明连接正常;若输出本地目录,需重新检查环境变量和连接参数。


内容的提问来源于stack exchange,提问作者thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:17:10