这里分析一下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程序来作,并且支持多种语言算法