Apache spark Spark读取本地文件需要文件存在于主节点中
1.我的问题 我在一个4节点spark集群中运行一个wordCount程序。程序的输入是本地文件系统文件。我知道我应该将文件分发给所有工作节点(在我的情况下,quad102是主节点,quad103-quad105是从节点,因此文件应该存在于这些从节点中的同一路径中,我确信我不会将quad102作为从节点) !!!但是,在我的实践中,如果主节点没有相同的文件,那么程序也无法运行,事实上,4个节点都需要在相同的文件中包含此文件,否则它无法运行。我已经阅读了SparkContext.textFile源代码,没有发现任何问题,有人能解释一下为什么主节点也需要这个文件吗?(我认为,只有从节点需要这个文件。) 2.我的程序和群集配置 (1) 4节点集群为独立模式,quad102为主,quad103-quad105从 (2) 程序非常简单:Apache spark Spark读取本地文件需要文件存在于主节点中,apache-spark,Apache Spark,1.我的问题 我在一个4节点spark集群中运行一个wordCount程序。程序的输入是本地文件系统文件。我知道我应该将文件分发给所有工作节点(在我的情况下,quad102是主节点,quad103-quad105是从节点,因此文件应该存在于这些从节点中的同一路径中,我确信我不会将quad102作为从节点) !!!但是,在我的实践中,如果主节点没有相同的文件,那么程序也无法运行,事实上,4个节点都需要在相同的文件中包含此文件,否则它无法运行。我已经阅读了SparkContext.textFile源
object WordCount {
def main(args:Array[String]) {
//For test
if(args.length == 1) println(args(0))
val conf = new SparkConf().setAppName("WordCount")
val sc = new SparkContext(conf)
val rdd = sc.textFile(args(0))
rdd.flatMap(p => p.split("\\s+")).map(x => (x, 1)).reduceByKey(_ + _).collect().foreach(println(_))
sc.stop()
}
}
(3) 我运行这个程序的命令
spark-submit --master spark://192.168.1.2:7077 --class cn.siat.postspark.mllib.WordCount file:///root/postspark_2.10-1.0.jar file:///root/Documents/java-listen-data/data/test1
我现在可以解释这个问题了。 因为我在主节点上运行这个程序。所以文件应该存在于主节点,如果我在从节点运行这个程序,一切都正常。
我做了一些测试来验证我的猜测。您应该确保运行该程序的节点上存在该文件,该文件仅由FileInputFormat用于getSplits,文件中的内容不会被读取,最后,worker node任务将根据分割在本地主机中读取该文件。这不是运行spark应用程序的实际机器吗(而不是spark主节点),需要在其上访问文件以确定拆分?