如何在IBM Cloud PySpark集群中用Python读取HDFS上的.pkl文件
解决HDFS上Pickle文件的Python加载问题
嘿,这个问题我熟!你之所以报错,是因为Python原生的pickle.load只能读取本地文件系统里的文件,而/user/clsadmin/terrs.pkl是HDFS分布式文件系统上的路径,直接用本地路径的方式访问当然找不到啦。结合你在IBM Cloud集群跑PySpark的场景,给你两个靠谱的解决方案:
方案一:用PySpark原生API读取(推荐)
既然你本来就在PySpark环境里,直接用Spark的API来读取HDFS文件是最顺畅的,还能避免分布式环境下的文件访问问题。代码示例如下:
from pyspark import SparkContext import pickle # 获取或创建Spark上下文 sc = SparkContext.getOrCreate() # 读取HDFS上的二进制文件,返回的RDD每个元素是(文件路径, 字节数据)的元组 hdfs_file_rdd = sc.binaryFiles("/user/clsadmin/terrs.pkl") # 提取字节数据并反序列化为pickle对象 # collect()会把RDD的数据拉到驱动节点,所以如果文件很大的话要注意内存哦 terrs_data = hdfs_file_rdd.map(lambda x: pickle.loads(x[1])).collect()[0]
IBM Cloud的Spark集群里,HDFS路径直接写/user/clsadmin/terrs.pkl就行,不用额外加hdfs:///前缀,集群会自动识别。
方案二:用HDFS操作库直接读取
如果你不想依赖PySpark的RDD,也可以用专门操作HDFS的Python库,比如pyarrow或者hdfs3。
用pyarrow的示例:
首先确保环境里安装了pyarrow(如果没装,用pip install pyarrow),然后:
import pyarrow.hdfs as hdfs import pickle # 建立HDFS连接,IBM Cloud集群通常会自动读取Hadoop配置,不用手动填host和port # 如果需要手动配置,可以从集群的Hadoop配置里找到namenode的地址和端口 fs = hdfs.HadoopFileSystem() # 打开HDFS文件并加载pickle对象 with fs.open('/user/clsadmin/terrs.pkl', 'rb') as f: terrs_data = pickle.load(f)
用hdfs3的示例:
先安装hdfs3(pip install hdfs3),然后:
from hdfs3 import HDFileSystem import pickle # 同样,集群环境下通常可以自动获取配置,无需手动指定参数 hdfs = HDFileSystem() with hdfs.open('/user/clsadmin/terrs.pkl', 'rb') as f: terrs_data = pickle.load(f)
小提醒
- 如果你是在PySpark作业中运行代码,优先选方案一,因为它和Spark的分布式架构更契合,不会出现单节点读取大文件的内存压力问题。
- 如果用方案二,确认集群已经配置了Hadoop环境变量(比如
HADOOP_CONF_DIR),这样库才能自动识别HDFS的配置信息。
内容的提问来源于stack exchange,提问作者Emily Johnson
相关产品推荐
相关产品推荐

