Hadoop:用并行计算求圆周率π

关于圆周率大家再熟悉
不过了: 我们从课本上学习到早在一千
多年前,祖冲之将圆周率计算到3.1415926到3.1415927之间…计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu看会不会出问题…另外一些人也想看看这个无限延伸的神秘数字背后是否有规律,能发现一些宇宙的秘密…

提起圆周率,不能不提及Fabrice Bellard,他被
认为是一位计算机天才,在业界有着重要的影响。1996年他编写了一个简洁
但是完整的C编译器和一个Java虚拟机Harissa。Fabrice Bellard发明的TinyCC是GNU/Linux环境下最小的ANSI C语言编译器,是目前号称编译速度最快的C编译器。Fabrice Bellard杰作
众多且涉及广泛,1998年编写了一个简洁的OpenGL实现TinyGL,2003年开发了Emacs克隆QEmacs,2005年还设计了一个廉价的数字电视系统。

Fabrice Bellard使用一台普通的台式电脑,完成了冲击由超级计算机保持的圆周率运算记录的壮举,他使用台式机将圆周率计算到了小数点后2.7万亿位,超过了由目前排名世界第47位的T2K Open超级计算机于去年8月份创造的小数点后2.5万亿位的记录。

Bellard使用的电脑是一台基于2.93GHz Core i7处理器的电脑,这部电脑的内存容量是6GB,硬盘则使用的是五块RAID-0配置的1.5TB容量的希捷7200.11,系统运行64位Red Hat Fedora 10操作系统,文件系统则使用Linux的ext4.

这次计算出来的圆周率数据占去了1137GB的硬盘容量,Bellard花了103天的时间计算出了这样的结果。

计算圆周率的方法有很多种:

微积分割圆法求:

或者利用便于计算机计算的丘德诺夫斯基公式法求:

不过这些计算方法都比较
复杂,难以让读者理解和使用并行计算来求,所幸数学上的泰勒级数是个好东西,它将微积分的东西改成用无限级数来表示,这样很容易进行并行计算分解:

π=4*∑(-1)^n+1/(2n-1) 或者写为: π=4*( 1-1/3+1/5-1/7+…)

也可以得到:πn =πn-1+(-1)^n+1/(2n-1),也就是可以通过迭代
前面的π值去求当前π值。

我们根据上面公式先写个单机程序来求:

public class PiTest{ public static void main(String[] args) { double pi=0.0; for(double i=1.0;i<1000000001d;i++){ pi += Math.pow(-1,i+1)/(2*i-1); } System.out.println(4*pi); }}

运行以上程序,并对照pi的标准值:3.141592653589793238462643383279…

如果i<10000,得到pi = 3.1416926635905345 (从红色部分以后不精确了)

如果i<1000000,得到pi = 3.1415936535907742 (从红色部分以后不精确了)

如果i<1000000000,得到pi = 3.1415926525880504(从红色部分以后不精确了)

……

可以看到,当迭代的轮数越大,求出的π值越精确。

由于是无限累加,我们可以很容易改成并行程序求解,比如i=4n,可以分成4段并行求解,再将4部分和合并起来得到最终π值。假设我们有4台计算机,并行计算设计如下:

我们这里通过fourinone提供的各种并行计算模式去设计,第一次使用可以参考分布式计算上手demo指南,开发包下载地址:http://code.google.com/p/fourinone/

程序实现:

PiWorker:是一个π计算工人实现,我们可以看到它通过命令行输入一个计算π值的起始值和结束值,我们同时启动4个PiWorker实例,启动时指定不同的起始结束参数。

PiCtor:是一个π计算包工头实现,它的实现很简单,
获取到线上工人后,通过doTaskBatch进行阶段计算,等待每个工人计算完成后,将各工人返回的π计算结果合并累加。

运行步骤:

1、启动ParkServerDemo(它的IP端口已经在配置文件指定)

java -cp fourinone.jar; ParkServerDemo

2、运行4个PiWorker,将迭代100,000,000轮的计算拆分到4个工人并行完成,这里方便演示是在同一台机器上,现实应用中可以在多台计算机上完成。

java  -cp fourinone.jar; PiWorker localhost 2008 1 250000000

java  -cp fourinone.jar; PiWorker localhost 2009 250000000 500000000

java  -cp fourinone.jar; PiWorker localhost 2010 500000000 750000000

java  -cp fourinone.jar; PiWorker localhost 2011 750000000 100000000

3、运行PiCtor

java  -cp fourinone.jar; PiCtor

可以看到,4个工人实例在同台机器并行完成计算π值的时间为29秒,如果是运行单机程序PiTest完成的时间在45秒,精准度都是到小数点后8位“3.14159265”,但是耗时上有明显差距,如果多机多实例,效率还会进一步提升,并行计算性能提升分析可以参考“使用并行计算大幅提升递归算法效率”。

完整demo源码如下:

// ParkServerDemo

import com.fourinone.BeanContext;public class ParkServerDemo{ public static void main(String[] args) { BeanContext.startPark(); }}

// PiWorker

import com.fourinone.MigrantWorker;import com.fourinone.WareHouse;public class PiWorker extends MigrantWorker{ public double m=0.0,n=0.0; public PiWorker(double m, double n){ this.m = m; this.n = n; } public WareHouse doTask(WareHouse inhouse) { double pi=0.0; for(double i=m;i<n;i++){ pi += Math.pow(-1,i+1)/(2*i-1); } System.out.println(4*pi); inhouse.setObj("pi",4*pi); return inhouse; } public static void main(String[] args) { PiWorker mw = new PiWorker(Double.parseDouble(args[2]),Double.parseDouble(args[3])); mw.waitWorking(args[0],Integer.parseInt(args[1]),"PiWorker"); }}

// PiCtor

import com.fourinone.Contractor;import com.fourinone.WareHouse;import com.fourinone.WorkerLocal;import java.util.Date;public class PiCtor extends Contractor{ public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers("PiWorker"); System.out.println("wks.length:"+wks.length); WareHouse[] hmarr = doTaskBatch(wks, inhouse); double pi=0.0; for(WareHouse result:hmarr){ pi = pi + (Double)result.getObj("pi"); } System.out.println("pi:"+pi); return inhouse; } public static void main(String[] args) { PiCtor a = new PiCtor(); long begin = (new Date()).getTime(); a.giveTask(new WareHouse()); long end = (new Date()).getTime(); System.out.println("time:"+(end-begin)/1000+"s"); a.exit(); }}

时间: 2024-10-25 20:35:34

Hadoop:用并行计算求圆周率π的相关文章

c语言-C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环

问题描述 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 解决方案 http://jingyan.baidu.com/article/bea41d437c69b8b4c51be6e9.html 解决方案二: public class Test { public static void main(String[] args) { System.out.println("怎么插入代码块.."); } }

Nulta: Lucene+Hadoop分布式并行计算搜索框架

今天在微博上看到 @陈利人 分享的关于分布式Lucene的文章,评论里也出现了一些新的基于Lucene和Hadoop的搜索框架,比如这个Nulta.因为自己的毕设是关于分布式索引的,自己也使用过Lucene,Hadoop,一直很关注也很感兴趣,就大致了解了下Nulta这个框架. 根据主页里的介绍,Nulta的整个架构和思路还是不错的,我也能从它的设计中找到自己毕设的一些想法,.现在最新的源码是1.0a9版的,源码内容不多,将几块产品都整合了起来,具体的配置内容在这里给出了.具体Nulta的使用性

c语言-C语言用递归求圆周率的值,怎么实现

问题描述 C语言用递归求圆周率的值,怎么实现 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 解决方案 C语言实现求圆周率归并排序递归实现C语言

C++项目参考解答:累加求圆周率

[项目-累加求圆周率] 用如下公式求π的近似值(计算直到最后一项的绝对值小于10−5) π4=1−13+15−17+... [参考解答] #include <iostream> using namespace std; int main( ) { int n,sign; double total,f; n=1; total=0; sign=1; f=1; //用f代表待累加的每一项的绝对值 while(f>1e-5) { total+=(sign*f); n+=2; f=1.0/n; s

C语言求圆周率的简单实现方法_C 语言

本文实例讲述了C语言求圆周率的方法.分享给大家供大家参考,具体如下: #include <stdio.h> #include <math.h> void main() { int s; float n,t,pi; t=1,pi=0;n=1.0;s=1; while(fabs(t)>1e-6) { pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4; printf("pi=%10.6f/n",pi); } 此处得出的结果可精确到小数

hadoop和hbase求指教

问题描述 大神们好!!我以前在3台ubantu上搭测试环境.搞了好久,莫名的成功,现在有5台debian机器,怎么搭都不成功.配置都一样..我怀疑是hosts的问题.主机名域名ipEC2-1a.com50.0.0.1EC2-2b.com50.0.0.2现在是这样的错误如果注释127.0.0.1localhostjps一下namenode也启动不了.如果写127.0.0.1EC2-1localhost就吧主机定义到了127这样namenode启动的了,但是报addBlock错误和node01错误d

const-用蒙特卡洛方法求解圆周率

问题描述 用蒙特卡洛方法求解圆周率 //蒙特卡洛法求圆周率 #include #include #include #include using namespace std; double FindPi(const long n) { srand(time(NULL)); long sum = 0; double x = 0.0, y = 0.0; for (long i = 0; i < n; i++) { x = (double)(rand())/(double)RAND_MAX; y = (

c语言 计算圆周率π 的值

问题描述 c语言 计算圆周率π 的值 对于正整数n,在原点为圆心的一个半径n的圆盘内(包括圆周内的点)的整数格子点的个数设为C(n),n →∞的时候C(n) / n2接近圆周率.基于这个求圆周率的近似值输入一个n,C(n) / n2做为double型输出,C(n)为long型 [入力]正整数 n 1つ. [出力] n と C(n) / n2 とを,書式を ""%d:%.15f "" として書き出せ. [例]输入例1000 输出例1000:3.141549000000

基于Hadoop的化合物生物活性分析系统

基于Hadoop的化合物生物活性分析系统 李杰辉,张亮,陈健,南蓬 通过药物虚拟筛选,发现在具有生物活性化合物过程中,存在小分子结构相似性比较计算繁杂等问题.为此,结合MapReduce模型,提出一种基于Hadoop 的并行计算模型处理方法,并通过Hadoop 工具予以实现.同时根据Hadoop 分区算法不均匀.容错功能存在重复计算等问题对该方法进行改进.实验结果表明,该方法平均加速效率达到0.91,具有较好的可靠性和扩展性. 关键词:生物活性:生物信息学:并行计算:可扩展性:数据库:Hadoo