spark學習筆記3之spark樣例分析
github樣例
一開始自己寫案例還是比較費勁的,我們還是遵照那個原則,先大步快跑,搞定全局,再回頭查缺補漏。
https://github.com/apache/spark/tree/master/examples計算圓周率Pi
scala代碼如下:
/**
* @author Ted
* @date 2022/2/9 15:48
* @version 1.0
*/
object SparkPi {
def main(args: Array[String]): Unit = {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder
.appName("Spark Pi")
.getOrCreate()
val slices = if (args.length > 0) args(0).toInt else 2
val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
val count = spark.sparkContext.parallelize(1 until n, slices).map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y <= 1) 1 else 0
}.reduce(_ + _)
println(s"Pi is roughly ${4.0 * count / (n - 1)}")
spark.stop()
}
}
}邏輯分析
我們都知道圓的面積公式為?
?。此時我們畫一個半徑為1的圓。然后再往圓上套一個邊長為2的正方形。之后我們開始隨機向這個正方形領(lǐng)域描點。隨著我們描點的數(shù)據(jù)量越來越大,在圓里面的點和在正方形里的點的數(shù)量之比就會越來越趨近于一個常數(shù)。而這個常數(shù)其實也近似等于 圓和正方形的面積之比。如下:

由于我們的圓半徑為1,正方形邊長為2。所以就會得出

園中的點用代碼表示為如下,當x2+y2小與1時,點肯定落在圓內(nèi),取值1,讓count總數(shù)+1。

運行代碼
由于樣例函數(shù)的jar包在spark安裝包中存在,我們直接用如下命令運行程序,并指定參數(shù)。本次指定10個分區(qū),100萬條數(shù)據(jù)。
../../bin/spark-submit --master spark://node1:7077,node2:7077 --class org.apache.spark.examples.SparkPi ./spark-examples_2.11-2.3.4.jar 10
會從后臺看到已經(jīng)運行了一個spark程序,核心數(shù)12,執(zhí)行速度6秒。執(zhí)行過程如下,啟動了10個任務(wù)并行計算。每個執(zhí)行器都有自己的唯一id,每個任務(wù)也有自己的唯一id。然后每個任務(wù)由指定的執(zhí)行器進行執(zhí)行。最后得出結(jié)果為Pi is roughly 3.140751140751141??梢娺€不太準確。那么我們接下來繼續(xù)加碼計算量。

擴大數(shù)據(jù)量
接下來我們輸入100參數(shù),1000萬條數(shù)據(jù)進行計算。看來任務(wù)量還是不足,計算結(jié)果還未接近
Pi is roughly 3.1418151141815116

繼續(xù)擴大數(shù)據(jù)量
本次我們開啟1000個任務(wù),給他一個億??梢钥吹?,147和148已經(jīng)不夠用了,把他的兄弟146也叫了起來。但是還是不給力啊。
Pi is roughly 3.1417156714171566

拼了
這次直接開啟10000個任務(wù),算它10億次。終于看到了我腦海中記憶到的那個數(shù)字了。
Pi is roughly 3.141595919141596

運行腳本
接下來,我們直接編寫一個運行腳本來運行我們的spark計算程序。當然平時我們需要養(yǎng)成一個習慣,將這些運行程序收集到一個目錄下邊。例如如下,我們在root家目錄創(chuàng)建于給sparkexe目錄。將我們的腳本放到里面。

然后我們執(zhí)行如下命令,就可以了。
. submit 'org.apache.spark.examples.SparkPi' "/opt/bigdata/spark-2.3.4-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.3.4.jar" 100
10000個任務(wù),10億次計算細節(jié)如下。

指定核心數(shù)量
我們還可以指定spark任務(wù)執(zhí)行中可以申請的核心數(shù)量,上述過程都直接申請了12個核心,每個執(zhí)行器4個核心。接下來我們指定核心數(shù)量為6個。那么每個執(zhí)行器會分配兩個核心。


指定執(zhí)行器核心
如果我們制定每個執(zhí)行器只能擁有一個核心,同時我們指定本次任務(wù)分配12個核心。那么就會出現(xiàn)12個執(zhí)行器。

