Spark Pi是Apache Spark官方提供的一个示例程序,该案例使用 Spark 进行分布式计算,通过蒙特卡罗方法估算圆周率(π)的值,其估算π原理如下:

上图中,正方形边长为2,圆的半径为1,那么正方形面积为4,圆的面积为π。现在向正方形内随机“打点”,即随机生成(x,y)坐标,范围不超过正方向范围,最终记录在圆内打点的个数与正方形内打点的个数,两者比例为4/π,当“打点”个数非常大时,可以大约算出π的大小。
Spark Pi源码如下(Spark源码examples模块中org.apache.spark.examples.SparkPi):
object SparkPi {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder
.appName("Spark Pi")
.getOrCreate()
val slices = if (args.length > 0) args(0).toInt else 2
//如果slices为100,那么n为一千万
val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
//随机生成n-1个点,然后计算落在圆内的点的个数
val count = spark.sparkContext.parallelize(1 until n, slices).map { i =>
//random返回的是0到1之间的随机数,x,y的取值范围是-1到1
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y <= 1) 1 else 0
}.reduce(_ + _)
//计算pi-圆的面积/正方形的面积=count/n,即:pi = 4*count/(n-1)
println(s"Pi is roughly ${4.0 * count / (n - 1)}")
spark.stop()
}
}以上代码注意如下几点: