2014-04-24 29 views
4

在火花上相對較新,並嘗試在獨立的12核心三機羣上運行SparkPi示例。我無法理解的是,與使用12個切片相比,使用單個切片運行此示例可以獲得更好的性能。當我使用並行功能時也是如此。時間幾乎是線性增加每個切片。請讓我知道如果我做錯了什麼。代碼片段如下:SparkPi運行緩慢,超過1片

val spark = new SparkContext("spark://telecom:7077", "SparkPi", 
    System.getenv("SPARK_HOME"), List("target/scala-2.10/sparkpii_2.10-1.0.jar")) 
val slices = 1 
val n = 10000000 * slices 
val count = spark.parallelize(1 to n, slices).map { 
    i => 
    val x = random * 2 - 1 
    val y = random * 2 - 1 
    if (x * x + y * y < 1) 1 else 0 
}.reduce(_ + _) 
println("Pi is roughly " + 4.0 * count/n) 
spark.stop() 

更新:問題是隨機函數,因爲它是一個同步方法,它無法擴展到多個核心。

+0

你能否將你的更新添加爲答案? –

回答

1

sparkpi示例中使用的隨機函數是一種同步方法,無法縮放到多個內核。這是一個很簡單的示例,可以在集羣上部署,但不要用它來檢查Spark的性能和可伸縮性。

0

正如Ahsan在他的回答中提到的,問題在於'scala.math.random'。 我用'org.apache.spark.util.random.XORShiftRandom'取代了它,現在使用多個處理器使得Pi計算運行得更快。 下面是我的代碼,這是從火花分佈SparkPi例的修改後的版本:

// scalastyle:off println 
package org.apache.spark.examples 

import org.apache.spark.util.random.XORShiftRandom 

import org.apache.spark._ 

/** Computes an approximation to pi */ 
object SparkPi { 
    def main(args: Array[String]) { 
    val conf = new SparkConf().setAppName("Spark Pi").setMaster(args(0)) 
    val spark = new SparkContext(conf) 
    val slices = if (args.length > 1) args(1).toInt else 2 
    val n = math.min(100000000L * slices, Int.MaxValue).toInt // avoid overflow 
    val rand = new XORShiftRandom() 

    val count = spark.parallelize(1 until n, slices).map { i => 
     val x = rand.nextDouble * 2 - 1 
     val y = rand.nextDouble * 2 - 1 
     if (x*x + y*y < 1) 1 else 0 
     }.reduce(_ + _) 

    println("Pi is roughly " + 4.0 * count/n) 
    spark.stop() 
    } 
} 
// scalastyle:on println 

當運行上述使用一個芯與參數的本地[1] 16'它需要大約60秒的程序我的筆記本電腦。相同的程序使用8核('本地[*] 16')需要17秒。