這裏分析一下spark自帶的求PI的例子,作爲入門的代碼
首先要介紹一下這個求PI的原理
其實也算是使用的蒙特卡洛模擬算法, 基本的方法就是考慮一下邊長爲1的正方形
其中以正方形的一個點爲中心,以1爲半徑畫圓的話,能夠有1/4個圓畫到
正方形中, 根據這個原理來隨機的生成(1, 1)之間的點
若是知足x2 + y2 <= 1的話,那麼就是在扇形區域內
不然在扇形區域外
用這種方法隨機生成不少點的話,用扇形區域內的點數比上總數
能夠近似理解爲扇形的面積
S:扇形區域內點數
N:總點數
1/4rr*PI = S/N
可的PI=4S/N
代碼實現就以下面所示java
import sys from random import random from operator import add from pyspark import SparkContext if __name__ == "__main__": """ Usage: pi [partitions] """ //初始化sc sc = SparkContext(appName="PythonPi") //設置並行度 partitions = int(sys.argv[1]) if len(sys.argv) > 1 else 2 n = 100000 * partitions //定義閉包函數 def f(_): x = random() * 2 - 1 y = random() * 2 - 1 return 1 if x ** 2 + y ** 2 < 1 else 0 //這裏的map函數相似於hadoop的map過程,reduce也是相似於reduce過程,最後獲得的是數量的加和 //這裏的reduce也能夠按照key來 count = sc.parallelize(range(1, n + 1), partitions).map(f).reduce(add) print("Pi is roughly %f" % (4.0 * count / n)) sc.stop()
由上面的程序可見,使用spark編寫mr程序是很方便的
不用像hadoop那樣寫那麼長的java程序來作,並且支持多種語言算法