Spark集群模式下使用Java读取本地CSV文件且无需上传HDFS的方法咨询
Spark集群模式读取本地CSV文件(无需上传HDFS)解决方案
问题根因
集群模式下Spark Executor进程分布在集群各Worker节点,默认仅能访问自身节点的本地文件系统与分布式存储:仅存放在任务提交客户端节点的本地CSV文件,其余Worker节点的同路径下不存在该文件,因此会触发文件找不到的报错。
可行方案
方案1:使用Spark自带文件分发机制(推荐,适合中小文件)
提交Spark任务时通过--files参数将本地CSV文件随任务一同分发到所有Executor的工作目录,代码中直接通过文件名读取即可,无需加路径前缀。
提交示例:spark-submit --master yarn --deploy-mode cluster --files /本地绝对路径/xxx.csv 你的任务脚本.py读取代码示例(PySpark):
df = spark.read.csv("xxx.csv", header=True)方案2:全Worker节点同路径存放文件
将目标CSV文件拷贝到集群所有Worker节点的完全相同的绝对路径下,之后代码中直接通过本地路径读取即可:df = spark.read.csv("file:///全节点统一的绝对路径/xxx.csv", header=True)该方案适合集群节点规模小、文件变更频率极低的场景。
方案3:Driver端读取后转Spark分布式数据集
若文件体积较小,可直接在Driver端调用本地IO接口读取文件,再转为Spark DataFrame,全程不需要Executor访问本地文件:import pandas as pd # 仅在Driver端执行本地文件读取 local_df = pd.read_csv("/本地绝对路径/xxx.csv") df = spark.createDataFrame(local_df)注意该方案仅适合GB级以内的小文件,文件过大会导致Driver内存溢出。
方案4:共享目录挂载
将存放CSV的本地目录通过NFS等网络文件系统,挂载到集群所有Worker节点的同一路径下,之后即可直接通过file://前缀的路径读取,适合大文件且不想上传HDFS的场景。
注意事项
- 超过10GB的大文件不建议使用上述本地读取方案,分发、跨节点读取的开销远高于上传HDFS的开销,优先选择HDFS等分布式存储存储大文件。
内容的提问来源于stack exchange,提问作者mukesh dewangan
相关产品推荐
相关产品推荐

