標題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=S1V;那麼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()