如何使用PyArrow连接远程HDFS?遇到libjvm加载错误该怎么解决?
报错原因分析
你收到的OSError: Unable to load libjvm报错是因为PyArrow的HadoopFileSystemRPC接口底层依赖Java虚拟机,运行时会尝试加载JDK的libjvm.so动态库,你当前系统没有正确配置JDK环境变量,导致程序找不到该文件。
另外你代码里的host参数加了http://前缀也是错误的,RPC模式下不需要加协议前缀。
问题解决步骤
方案1:WebHDFS连接(推荐,无需本地安装Hadoop、JDK)
该方案通过HDFS开放的HTTP接口访问,完全不依赖本地Java和Hadoop环境,适配你的场景:
- 首先确认远程HDFS集群已经开启WebHDFS功能,默认端口Hadoop2为50070,Hadoop3为9870
- 修改代码如下:
from pyarrow import fs # 端口替换为你集群实际的WebHDFS端口 hdfs = fs.WebHdfsFileSystem(host='172.16.1.7', port=50070) # 测试列目录 print(hdfs.ls('/'))
方案2:RPC模式连接(需要本地配置Java、Hadoop)
如果你必须使用8020 RPC端口连接,按以下步骤配置:
- 首先定位libjvm.so路径,执行命令:
find /usr -name "libjvm.so"
记录输出的文件所在目录,例如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144/jre/lib/amd64/server/ - 配置环境变量,将以下内容写入
~/.bashrc后执行source ~/.bashrc生效:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144 # 替换为你本地JDK根目录 export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH # 下载同远程集群版本的Hadoop二进制包解压后,配置HADOOP_HOME export HADOOP_HOME=/path/to/your/hadoop/directory export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
- 修改原有代码去掉http前缀:
from pyarrow import fs hdfs = fs.HadoopFileSystem('172.16.1.7', 8020)
关于是否需要安装本地Hadoop的说明
如果使用WebHDFS方案,完全不需要在本地安装Hadoop。如果使用RPC端口连接,则需要本地部署和远程集群版本一致的Hadoop二进制包,不需要启动本地Hadoop服务,仅需解压配置环境变量即可。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

