先貼出SparkPi的代碼:
<pre name="code" class="java">import scala.math.random
import org.apache.spark._
/** Computes an approximation to pi */
object SparkPi {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Spark Pi")
val spark = new SparkContext(conf)
val slices = if (args.length > 0) args(0).toInt else 2
val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
val count = spark.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(_ + _)
println("Pi is roughly " + 4.0 * count / n)
spark.stop()
}
}
該程序的核心代碼是:
val count = spark.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(_ + _)
spark.parallelize(1 until n, slices)
從普通數組創建RDD,裏面包含了1到n,這n個數字,它們分別在slices個分區中
map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
}
map是對RDD中的每個元素都執行一個指定的函數來產生一個新的RDD。任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。這裏的map作用是給出x、y兩個隨機數,如果這兩個數的平方和小於1,該數爲1,否則,爲0。
reduce(_ + _)
對前面RDD中的元素求和。
核心代碼都是Scala編程基礎,該方法是計算圓周率的蒙特卡洛法。
Tough times never last, but tough people do.