2017-03-29 50 views
0

剛剛開始使用Spark和Scala。我們在我們的開發cloudera hadoop集羣上安裝了Spark 2,並且正在使用spark2-shell。我正在閱讀一本書來學習一些基礎知識。它的例子顯示的println(富)而不做收集工作,但是這不是爲我工作:Spark Scala println需要collect()?

scala> val numbers = sc.parallelize(10 to 50 by 10) 
numbers: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[9] at parallelize at <console>:24 

scala> numbers.collect().foreach(println) 
10                    
20 
30 
40 
50 

scala> numbers.foreach(x => println(x)) 

scala> 

正如你所看到的,不執行打印作業,除非我做一個收集()。

這是怎麼回事,這本書是錯的,還是有趣的是我的spark/scala/config?

版本信息:

Spark version 2.0.0.cloudera2 
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111) 
+1

你在哪個環境中跑步?如果您在羣集上運行,那麼沒有收集的foreach將首先在羣集上運行,而不是在本地計算機上運行。 – puhlen

+0

謝謝,猜猜這是問題。我們的DEV hadoop集羣運行spark有幾個數據節點。 – medloh

回答

3

這就是你遇到正確的行爲,傳遞給numbers.foreach的代碼將在不同的節點上執行,但輸出將不會被收集並返回到驅動程序。

+0

嗯,好的。這本書假設你會在一個簡單的本地虛擬機上運行它,並且所有的東西都在那裏運行。也許這是我的問題,我們的DEV hadoop集羣有幾個數據節點。 – medloh