[SPARK] Spark範例: 以SparkPi為例

Spark提供以下三種程式寫作方式: python, scala, 以及java
其中, scala是其原生支援的程式語言,
理論上來說, 應該有最簡潔的架構與語法,
於是, 我們就從scala出發, 來看看SparkPi是如何撰寫,
以下是SparkPi的程式, 來自:
spark/examples/src/main/scala/org/apache/spark/examples/SparkPi.scala



在所有程式中, 去除宣告, 變數輸入, 溢位保護, 輸出之後,
只剩下這一行:

val count = spark.sparkContext.parallelize(1 until n, slices).map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y <= 1) 1 else 0
}.reduce(_ + _)

以演算法來說, SparkPi用Monte Carlo的方式來計算圓周率,
考慮到圓面積為: pi*r*r, 在圓半徑為1時, 圓面積為pi,
而SparkPi就用Monte Carlo的方式來計算半徑為1的圓面積,
簡單來說, 透過在S個節點平行 (map) 且灑大量在2X2區域內撒點 (100000),
取得點在圓內的數量 (判斷式回報為1),

if (x*x + y*y <= 1) 1 else 0

之後, 回收個分散節點上的計算 (reduce),
換成機率: count / (n - 1), 乘上總面積4之後, 就得到pi的數值,
n-1 應該是因為degree-of-freedom,

SparkPi也是一種map-redcue的架構,
但是和hadoop的map-reduce相比, SparkPi簡單不少,
原有的map-reduce比較像是寫兩隻程式, 在hadoop下偕同運作,
而scala下的SparkPi則比較像是提出一個工作計畫,
然後由Spark分配給各節點完成.

在此程式中, 用到兩個平行化的指令: map, reduce,
事實上, 在Spark中, 兩者從屬不同分類,
也有不同的功能導向, 我們將會在之後的文章中繼續介紹,

留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 5G NR Measurement Events