相对较新的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()
更新:问题在于随机功能,因为它是一种同步方法,它无法扩展到多个核心。
答案 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秒。