2015-12-31 21 views
2

1.我的問題。Spark讀取本地文件需要該文件存在於主節點

我在4節點spark集羣中運行wordCount程序。程序的輸入是本地文件系統文件。我知道我應該將文件分發給所有工作節點(在我的情況下,quad102是主節點,quad103-quad105是從節點,所以文件應該存在於這些從節點中的相同路徑中,並且我確信我不會使quad102作爲奴隸)根據這個問題的答案Spark: how to use SparkContext.textFile for local file system !!! 但是,在我的練習,如果主節點沒有相同的文件,程序不能運行,實際上,4節點都需要在相同的文件中有這個文件,否則它可以不會跑。我已通過SparkContext.textFile源代碼閱讀,我沒有發現任何問題,可能有人解釋爲什麼主需要這個文件呢?(在我看來,只有從節點需要這個文件。)

2 。我的程序和羣集配置。

(1)4節點羣集是獨立模式,quad102是主節點,quad103-quad105是從節點。

(2)的程序非常簡單:

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)指令i運行此程序。

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 

回答

1

我現在可以解釋這個問題了。 因爲我在主節點上運行這個程序。所以文件應該存在於主節點中,如果我在從節點上運行這個程序,一切都很好。 我已經做了一些測試來驗證我的猜測。您應該確保該文件存在於您運行程序的節點上,該文件僅用於FileInputFormat的getSplits,不讀取文件中的內容,最後,worker節點任務將根據本地主機讀取文件到分裂。

+0

實際上不是它正在運行spark應用程序的機器(而不是spark-master節點),在該機器上需要訪問文件以確定分割? –