在spark文档中,addFile(path)函数将给定文件复制到特定位置。但实际上它不同于一个执行器。 因为该路径包含执行程序ID。 有没有办法将该路径配置为对所有执行程序保持不变。
答案 0 :(得分:1)
sc.addFile(path)
中的路径是驱动程序上的本地文件路径或HDFS或HTTP / HTTPS网址上的路径。
确保文件在所有执行程序上下载,并通过SparkFiles.get(fileName)
提供。
以下是Learning Spark本书中的一个示例。
val distScript = "./src/R/finddistance.R"
val distScriptName = "finddistance.R"
sc.addFile(distScript)
val distances = contactsContactLists.values.flatMap(x =>
x.map(y =>
s"$y.contactlay,$y.contactlong,$y.mylat,$y.mylong")).pipe(Seq(SparkFiles.get(distScriptName)
)
)
请注意闭包中的SparkFiles.get
仅使用文件名部分而没有完整路径。
distScript
是驱动程序上具有相对路径的文件。
distScriptName
只是执行程序可以与SparkFiles.get
函数一起使用的文件名(不包括路径)。如果您的作业通过addFile
我们不应该真正关心所有执行者的路径是否一致。它的将由Spark在所有执行程序上提供,其中SparkFiles.get(fileName)
位于您的RDD闭包函数中(在您的执行程序上执行)。