热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hadoop估算π

一、hadoop不适合计算密集型的工作以前看过一个PPT:HadoopIn45MinutesorLess,记得上面说hadoop不适合计算密集型的工作&
一、hadoop不适合计算密集型的工作 

以前看过一个PPT: Hadoop In 45 Minutes or Less ,记得上面说hadoop不适合计算密集型的工作,比如计算PI后100000位小数。 

但是,前几天,我却发现了在hadoop自带的examples里,竟然有PiEstimator这个例子!!它是怎么做到的?? 


二、通过扔飞镖也能得出PI的值? 

百度一下,计算PI的方法还真不少。但在hadoop examples代码中的注释写的是:是采用 Quasi-Monte Carlo 算法来估算PI的值。 

维基百科中对Quasi-Monte Carlo的描述比较理论,好多难懂的公式。 

好在google了一把,找到了斯坦福大学网站上的一篇文章:《通过扔飞镖也能得出PI的值?》,文章很短,图文并茂,而且很好理解。 

我这里将那篇文章的重要部分截了个图: 



对上面的图再稍微解释一下: 
1、Figure2是Figure1的右上角的部分。 
2、向Figure2中投掷飞镖若干次(一个很大的数目),并且每次都仍在不同的点上。 
3、如果投掷的次数非常多,Figure2将被刺得“千疮百孔”。 
4、这时,“投掷在圆里的次数”除以“总投掷次数”,再乘以4,就是PI的值!(具体的推导过程参见原文) 

这样也能算出PI的值?相当强悍吧,呵呵。 


在这个算法中,很重要的一点是:如何做到“随机地向Figure2投掷”,就是说如何做到Figure2上的每个点被投中的概率相等。 

hadoop examples代码中,使用了Halton sequence保证这一点,关于Halton sequence,大家可以参考维基百科。 

我这里再总结一下Halton sequence的作用: 
在1乘1的正方形中,产生不重复,并且均匀的点。每个点的横坐标和纵坐标的值都在0和1之间。 

正是这样,保证了能够做到“随机地向Figure2投掷”。 


这个实际上叫做蒙特卡洛算法 

我们取一个单位的正方形(1×1) 里面做一个内切圆(单位圆) 
)
则 (单位正方形面积 : 内切单位圆面积) = (单位正方形内的飞镖数 : 内切单位圆内的飞镖数 )

通过计算飞镖个数就可以把单位圆面积算出来, 通过面积,在把圆周率计算出来。 

注意 

精度和你投掷的飞镖次数成正比



三、一定要用hadoop吗? 

在《通过扔飞镖也能得出PI的值?》一文中,网页中自带了一个Flash,用ActionScript来计算PI的值。 

用这种算法来估算PI值,其实是一个统计学的方法。如果要估算正确,首先要保证取样足够多(即投掷次数足够多)。但是如果是单机上运行程序,取太多的样,很容易crash your computer. 

所以,这里用hadoop的原因可以在集群上并行运行多个map任务,同时集群上的节点又非常多,这样就能够保证取到足够多的样了! 


四、hadoop examples代码解读 

上代码:

Java代码  收藏代码
  1. public void map(LongWritable offset,  
  2.                 LongWritable size,  
  3.                 OutputCollector out,  
  4.                 Reporter reporter) throws IOException {  
  5.   
  6.   final HaltonSequence haltonsequence = new HaltonSequence(offset.get());  
  7.   long numInside = 0L;  
  8.   long numOutside = 0L;  
  9.   
  10.   for(long i &#61; 0; i < size.get(); ) {  
  11.     //generate points in a unit square  
  12.     final double[] point &#61; haltonsequence.nextPoint();  
  13.     // 1、point就是取样点&#xff0c;即飞镖投中的部位。这是一个x和y都是0到1的值&#xff08;Halton sequence保证这一点&#xff09;。此时的坐标原点在A&#xff08;见Figure1&#xff09;。  
  14.   
  15.     //count points inside/outside of the inscribed circle of the square  
  16.     final double x &#61; point[0] - 0.5;  
  17.     final double y &#61; point[1] - 0.5;  
  18.     // 2、横纵坐标各减去0.5以后&#xff0c;我们就可以理解成&#xff1a;将坐标原点从A移到了B&#xff08;见Figure1&#xff09;。  
  19.     if (x*x &#43; y*y > 0.25) { // 3、根据勾股定理&#xff1a;x*x&#43;y*y > 0.5*0.5&#xff08;见Figure2&#xff09;&#xff0c;判断这个point是否在圆里。  
  20.       numOutside&#43;&#43;;  
  21.     } else {  
  22.       numInside&#43;&#43;;  
  23.     }  
  24.   
  25.     //report status  
  26.     i&#43;&#43;;  
  27.     if (i % 1000 &#61;&#61; 0) {  
  28.       reporter.setStatus("Generated " &#43; i &#43; " samples.");  
  29.     }  
  30.   }  
  31.   
  32.   //output map results  
  33.   out.collect(new BooleanWritable(true), new LongWritable(numInside));  
  34.   out.collect(new BooleanWritable(false), new LongWritable(numOutside));  
  35. }  




还需要说明的是&#xff1a; 
1、mapper的输出&#xff1a; 

Java代码  收藏代码
  1. //output map results  
  2.       out.collect(new BooleanWritable(true), new LongWritable(numInside));  // 投中的次数  
  3.       out.collect(new BooleanWritable(false), new LongWritable(numOutside));  



2、reducer&#xff0c;简单的对numInside进行sum操作。 

3、最后&#xff0c;PI的值等于&#xff1a; 


Java代码  收藏代码
  1. //compute estimated value  
  2.       return BigDecimal.valueOf(4// 上面图中公式中的4  
  3.       .setScale(20)     //精度  
  4.           .multiply(BigDecimal.valueOf(numInside.get()))    // 投中的次数  
  5.           .divide(BigDecimal.valueOf(numMaps))          // mapper的数量  
  6.           .divide(BigDecimal.valueOf(numPoints));       // 每个mapper投掷多少次  




总共投掷的次数 &#61; mapper的数目*每个mapper投掷的次数 

PI &#61; 4 * 投中的次数 / 总共投掷的次数 


五、小结 

hadoop&#xff08;mapreduce&#xff09;确实不适合做计算密集型的工作&#xff0c;尤其是下一步计算依赖于上一步的计算结果的时候。 

但是hadoop的examples中的计算PI的方法并不属于这一类&#xff0c;而是采用大量采样的统计学方法&#xff0c;还是属于数据密集型的工作。 

回到本文开头提到的PPT中&#xff0c;里面写的是“hadoop不适合计算PI小数点后1000000位小数”&#xff0c;而hadoop的example只是“估算PI的值”&#xff0c;二者并不是同一项任务。 



附&#xff1a;运行hadoop估算PI的命令 


Java代码  收藏代码
  1. hadoop jar $HADOOP_HOME/hadoop-*-examples.jar pi 100 100000000  



后面2个数字参数的含义&#xff1a; 
第1个100指的是要运行100次map任务 
第2个数字指的是每个map任务&#xff0c;要投掷多少次 

2个参数的乘积就是总的投掷次数。 

我运行的结果&#xff1a; 
Job Finished in 7492.442 seconds 

Estimated value of Pi is 3.14159266720000000000 

转载出处&#xff1a;http://thinkinginhadoop.iteye.com/blog/710847


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
尛丶俊_188
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有