您当前的位置: 首页 >  大数据

段智华

暂无认证

  • 0浏览

    0关注

    1232博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

大数据IMF传奇行动 Spark pi 例子计算 解析 百万次的运算

段智华 发布时间:2016-02-03 13:17:08 ,浏览量:0

 

圆周率pi的计算:

1、原理 r是圆的半径 圆的面积公式:C = π × r^2  圆面积=x^2+y^2 正方形面积公式:S = k^2     边长为1的1/4的圆面积 π*1^2 /4; 边长为1的正方形面积 1

那设想边长为1的1/4的圆中的某个点落到边长为1的正方形中的概率为p,则p=(π*1^2 /4)/1 ,即π=4p;p为概率,

也可设想边长为1的圆面积π × 1^2,边长为2的正方形面积2*2=4,圆中点落入正方形的概率p=π/4,即π=4p;p为概率,

 

2、这样,π就转化成了概率的计算,体现大数据并行计算的优势,计算更多的点落入到1/4圆中,计算量越大,π值越准确

3、源代码: package org.apache.spark.examples

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 //为避免溢出,n不超过int的最大值     val count = spark.parallelize(1 until n, slices).map { i =>        val x = random * 2 - 1  //小于1的随机数       val y = random * 2 - 1   //小于1的随机数       if (x*x + y*y < 1) 1 else 0  // 点落到圆的值,小于1计一次,大于1超出了圆面积就不算     }.reduce(_ + _)   //汇总累加落入圆中的次数     println("Pi is roughly " + 4.0 * count / n) //   count / n是概率,count落入圆中次的数,n是总次数;     spark.stop()   } }

4、spark运行1万次pi,jvm可以复用的,时间耗时秒级;    如果hadoop mr 运行1万次,需要1万台设备,jvm不复用,耗时2天    spark运行1百万次,时间也很快,强大的计算优势!   

 

本地的小测试

scala> :paste // Entering paste mode (ctrl-D to finish)

val count = (1 until 10).map { i =>       val x = random * 2 - 1       val y = random * 2 - 1       if (x*x + y*y < 1) 1 else 0     }.reduce(_ + _)

// Exiting paste mode, now interpreting.

count: Int = 8

scala> count res2: Int = 8

scala> (1 until 10).map(println) 1 2 3 4 5 6 7 8 9 res5: scala.collection.immutable.IndexedSeq[Unit] = Vector((), (), (), (), (), ( ), (), (), ())

 

关注
打赏
1659361485
查看更多评论
立即登录/注册

微信扫码登录

0.1397s