大数据IMF传奇行动 Spark pi 例子计算 解析 百万次的运算
2016-02-03 13:17
465 查看
圆周率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((), (), (), (), (), (
), (), (), ())
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((), (), (), (), (), (
), (), (), ())
相关文章推荐
- [LeetCode]217. Contains Duplicate
- df 命令结果显示的 Size 不等于 Avail + Used
- poj3250Bad Hair Day【单调栈】
- UVA 11374 Airport Express
- HDU 1021 Fibonacci Again 数学题
- 怎样把LoRa终端功耗降到极致
- .net 4.5 async await 简单用法
- 个人电脑上搭建openstack的实验室http://geek.csdn.net/news/detail/53890
- 大数据工具/框架
- 优秀大数据GitHub项目一览
- 4320: ShangHai2006 Homework 并查集+离线处理 思路题
- error: command 'gcc' failed with exit status 1
- Java大数据量导出Excel的问题
- 4320: ShangHai2006 Homework|并查集
- 位图和矢量图区别,PS和AI的区别
- CDOJ 1270 Playfair
- 在Word 2010中,为粘贴无格式文本设置快捷键 Alt+V
- Spark PairRDD 转化二
- Light OJ 1038 Race to 1 Again (期望DP)
- poj2585 Window Pains(拓扑排序判定)