用hadoop計算PI值

1、計算PI值的方式與原理

      百度一下,計算PI的方法還真很多。但在hadoop examples代碼中的註釋寫的是:是採用 Quasi-Monte Carlo 算法來估算PI的值。 

      維基百科中對Quasi-Monte Carlo的描述比較理論,好多難懂的公式。 

      好在google了一把,找到了斯坦福大學網站上的一篇文章:《經過扔飛鏢也能得出PI的值?》,文章很短,圖文並茂,並且很好理解。 

      我這裏將那篇文章的重要部分截了個圖: 



      對上面的圖再稍微解釋一下: 
      一、Figure2是Figure1的右上角的部分。 
      二、向Figure2中投擲飛鏢若干次(一個很大的數目),而且每次都仍在不一樣的點上。 
      三、若是投擲的次數很是多,Figure2將被刺得「千瘡百孔」。 
      四、這時,「投擲在圓裏的次數」除以「總投擲次數」,再乘以4,就是PI的值!(具體的推導過程參見原文) 


      在這個算法中,很重要的一點是:如何作到「隨機地向Figure2投擲」,就是說如何作到Figure2上的每一個點被投中的機率相等。 

      hadoop examples代碼中,使用了Halton sequence保證這一點,關於Halton sequence,你們能夠參考維基百科

      我這裏再總結一下Halton sequence的做用: 在1乘1的正方形中,產生不重複,而且均勻的點。每一個點的橫座標和縱座標的值都在0和1之間。 

正是這樣,保證了可以作到「隨機地向Figure2投擲」。java

      有人總結了一下,這個實際上叫作蒙特卡洛算法,咱們取一個單位的正方形(1×1) 裏面作一個內切圓(單位圓),則 單位正方形面積 : 內切單位圓面積 = 單位正方形內的飛鏢數 : 內切單位圓內的飛鏢數 ,經過計算飛鏢個數就能夠把單位圓面積算出來, 經過面積,在把圓周率計算出來。 
注意 ,精度和你投擲的飛鏢次數成正比。算法

 

二,運行hadoop估算PI的命令

[java] view plaincopyprint?oop

  1. <span style="white-space:pre">    </span>hadoop jar $HADOOP_HOME/hadoop-*-examples.jar pi 100 100000000  網站

     後面2個數字參數的含義: 
     第1個100指的是要運行100次map任務 
     第2個數字指的是每一個map任務,要投擲多少次 

     2個參數的乘積就是總的投擲次數。 

     我運行的結果: 
Screenshot from 2014-08-30 10_04_15google


三,總結

      hadoop的examples中的計算PI的方法屬因而採用大量採樣的統計學方法,仍是屬於數據密集型的工做。 spa

      

    轉載請註明出處: http://www.ming-yue.cn/hadoop-pi/.net

相關文章
相關標籤/搜索