有一份csv数据在当前节点的本地路径上,本地模式跑可以通过:file://+本地路径正常读取
python
df = spark.read \
.option("header", "true") \
.option("inferSchema", "true") \
.csv("file:///home/ll/py_code/spark/train.csv")
当需要跑集群模式时,由于其他节点访问不到该路径会报错,解决办法是想办法使得所有节点可以访问该文件,可以通过以下方式解决:
1、使用HDFS路径,将数据上传到hdfs
这是生产环境最标准的方式,将数据上传到HDFS上,让所有节点通过同一地址访问得到该数据;
2、无权限上传hdfs时,使用 --files + SparkFiles.get()
脚本使用:SparkFiles.get()
python
from pyspark.sql import SparkSession
from pyspark import SparkFiles # 导入SparkFiles
# 创建SparkSession
spark = SparkSession.builder \
.appName("ClusterFileRead") \
.getOrCreate()
# 核心:通过 SparkFiles 获取被分发到各节点的文件路径
# 这里的 "train.csv" 必须和 --files 参数中指定的文件名一致
distributed_file_path = SparkFiles.get("train.csv")
# 使用获取到的路径读取数据
df = spark.read \
.option("header", "true") \
.option("inferSchema", "true") \
.csv(distributed_file_path)
# 后续操作...
df.show(5)
print(f"数据行数: {df.count()}")
spark-submit 提交作业时添加 --files 参数:
bash
# 在 node1 上提交作业
$SPARK_HOME/bin/spark-submit \
--master spark://node1:7077 \ # 你的集群master地址
--deploy-mode client \
--files /home/ll/py_code/spark/train.csv \ # 关键参数:自动分发此文件
01_spark_read_data.py
3、使用共享文件系统(如NFS)路径
将所有节点挂载同一个网络存储,代码中指向挂载点(例如 /mnt/data/train.csv)
为何不使用广播变量方式?
广播变量应严格用于分发非常小且只读的辅助数据,例如配置、映射表、字典等。