SparkPi运行速度超过1个切片

时间:2014-04-24 11:53:25

标签: scala distributed-computing apache-spark

相对较新的spark并尝试在独立的12核三机群上运行SparkPi示例。我没有理解的是,与使用12个切片相比,使用单个切片运行此示例可以提供更好的性能。我使用并行化功能的情况也是如此。通过添加每个切片,时间几乎是线性缩放。如果我做错了,请告诉我。代码段如下:

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()

更新:问题在于随机功能,因为它是一种同步方法,它无法扩展到多个核心。

2 个答案:

答案 0 :(得分:1)

sparkpi示例中使用的随机函数是同步方法,无法扩展到多个核心。这是一个足够简单的示例,可以在您的集群上进行部署,但不要使用它来检查Spark的性能和可伸缩性。

答案 1 :(得分:0)

Ahsan在回答中提到,问题出在&scala.math.random&#39;。 我已将其替换为&#39; org.apache.spark.util.random.XORShiftRandom&#39;,现在使用多个处理器使Pi计算运行得更快。 下面是我的代码,它是来自Spark发行版的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

当我使用一个带有参数&#39; local [1] 16&#39;我的笔记本电脑大概需要60秒。相同的程序使用8个核心(&#39;本地[*] 16&#39;)需要17秒。