Spark自带求π的算法:蒙特卡洛算法

标题Spark自带求π的算法:蒙特卡洛算法

** 1.在我们对spark集群进行压力测试时,通常会选择spark自带计算π的类来进行测试,那么spark内部到底是如何求π的呢?我们这里先上一段测试脚本: **

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 6G\
--executor-memory 8G \
--executor-cores 4 \
--num-executor 10 \
./examples/jars/spark-examples_2.11-2.1.1.jar 100

上面最后一个数字100为随机投点次数,我们会发现,如果这个数字越大,那么计算出PI的结果越准确,那么内部到底是怎样原理。

** 2. 蒙特卡洛算法**
蒙特卡洛算法主要理论是:在一个正方形中,以正方形中心画一个圆,然后向此正方形中随机投点,计算落在圆内的概率,然后根据公式计算出π的值。
例如:
a.一个边长为2的正方形,那么它的面积S1=4 ,在此正方形内画一个圆,那么这个圆的半径r=1,圆的面积S2=πr²=π
b.此时开始随机投点,例如总投点数为sum,落在圆内的点数为count,那么可以认为圆的面积占正方形的面积比例为:V=count/sum
c.由此得知,正方形S1=4,圆形S2=π,圆形面积占正方形比例为V,S1与V的值都是一个常量,那么可以得出S2=S1
V;那么S2的面积就可以求出来了,进而就得出了π的值。

	val conf: SparkConf = new  SparkConf().setAppName("GetPi").setMaster("local[*]")
    val sc = new SparkContext(conf)
    //n总投点数
    val Sum = Int.MaxValue
    //count为落在圆内的点数
    val count = sc.parallelize(1 until Sum).map { i =>
      val x = random * 2 - 1 //随机投点所在x轴坐标
      val y = random * 2 - 1 //随机投点所在y轴坐标
      if (x*x + y*y <= 1) 1 else 0 //判断是都在圆内:x²+y²<=1
    }.reduce(_ + _)
    println(s"π的值是: ${4.0 * count / (Sum - 1)}")
    sc.stop()

你可能感兴趣的:(大数据)