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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章