SparkPi源码
import scala.math.random
import org.apache.spark._
/** Computes an approximation to pi */
object SparkPi {
def main(args: Array[String]) {
if (args.length == 0) {
System.err.println("Usage: SparkPi <master> [<slices>]")
System.exit(1)
}
val spark = new SparkContext(args(0), "SparkPi",
System.getenv("SPARK_HOME"), SparkContext.jarOfClass(this.getClass))
val slices = if (args.length > 1) args(1).toInt else 2
<span style="color:#3366ff;">val n = 100000 * 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) </span>
spark.stop()
}
}
用Spark的计算框架来求解 圆周率Pi
求解算法是根据蒙特卡洛投针求PI
调用者传个参数进去也就是投针次数,
默认投20万次,然后他要造成在一个边长为2的正方形里等概率投针的模拟。这里random()产生0~1之间的数,“*2”就是0~2之间等概率的数,再“-1”x与y就变成-1到1之间等概率的数,(x,y)就是在边长为2的正方形里均匀分布的点,正方形的内切圆面积就是PI,距原点小于1的就在园内,由“PI/4 = 园内点数/总点数”可以估计PI
SparkPi 默认采用两个平行的计算 来计算20万个点投到园内的个数 count
Pi = 园内点数/总点数 * 正方形面积