2014-02-15 47 views
6

當我在Spark-Shell中運行一些Apache Spark示例或作爲作業時,我無法在單臺機器上實現完整的內核利用率。例如:Spark爲什麼不使用本地機器上的所有內核

var textColumn = sc.textFile("/home/someuser/largefile.txt").cache() 
var distinctWordCount = textColumn.flatMap(line => line.split('\0')) 
          .map(word => (word, 1)) 
          .reduceByKey(_+_) 
          .count() 

當運行此腳本時,我大多數情況下在我的8核心計算機上只能看到1個或2個活動核心。 Spark是不是應該平行於此?

+3

看着你正在閱讀本地文件。所以只有一個分區,'flatMap'和'map'只使用一個核心。您可以在'reduceByKey'中使用'numPartitions'參數來設置並行性。例如'reduceByKey(_ + _,8)'。然後'reduceByKey'和'count'將使用8個內核。 – zsxwing

+0

@zsxwing你在哪裏看到它們只指定一個分區? .cache不限制分區嗎? – JimLohse

回答

1

當您運行本地火花外殼時,您仍然必須指定您的火花任務將使用的內核數量。如果你想使用8核心,請確保你運行你的shell之前,請確保你使用了

export MASTER=local[8] 

另外,正如@ zsxwing所說,您可能需要確保將數據分區到足夠的分區以保持所有內核繁忙,或者指定要查看的並行度。

+0

在類似Linux的機器上'export'很方便。如何在Windows上做到這一點? – Nick

+0

你可以將它設置爲你的代碼中的一個spark配置屬性。爲了使它更加靈活,可以將它作爲命令參數 – David

+0

或您在調用spark-shell的命令行中傳遞:['./bin/spark-shell --master spark:// IP:PORT'](http: //spark.apache.org/docs/latest/spark-standalone.html#connecting-an-application-to-the-cluster) – JimLohse

2

您可以使用local[*]在本地運行Spark,並且邏輯核心具有您的機器的工作線程數儘可能多。

相關問題