標籤:從spark架構中透視job
內容:
1、通過案例觀察Spark架構;
2、手動繪製Spark內部架構;
3、Spark Job的邏輯視圖解析;
4、Spark Job的物理視圖解析;
Action觸發的Job或者checkpoint觸發Job
==========通過案例觀察Spark架構 ============
jps看到的master,作用:管理叢集的計算資源,主要指記憶體、CPU,也會考慮磁碟或者網路;還做接受用戶端提交的作業請求,分配資源。說明:作業粗粒度,提交的時候就分配資源,作業啟動並執行過程時候,一般用已指派的資源,除非運行過程發生異常。
Worker進程,主要負責當前節點每寸和CPU的資源使用。
Spark是主從分布式的。
啟動spark-shell
./spark-shell --master spark://Master:7077,Worker1:7077,Worker2:7077
再重新整理web控制台
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
為什麼是24個cores,每個節點的記憶體1024M呢?
spark-env.sh裡面有配置
[email protected]:/usr/local/spark/spark-1.6.0-bin-hadoop2.6/conf# cat spark-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_71
export SCALA_HOME=/usr/local/scala-2.10.4
export HADOOP_HOME=/usr/local/hadoop-2.6.0
export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.0/etc/hadoop
#export SPARK_MASTER_IP=Master
export SPARK_WORKER_MEMORY=2g
export SPARK_EXCUTOR_MEMORY=2g
export SPARK_DRIVER_MEMORY=2g
export SPARK_WORKER_CORES=8
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=Master:2181,Worker1:2181,Worker2:2181 -Dspark.deploy.zookeeper.dir=/spark"
啟動spark-shell分配了資源了嗎?
當然分配了,standalone的模式是粗粒度分配資源的。
spark-shell預設情況下沒有任何的job,此時stage等都沒有,但是還是會分配資源的。
但是executors是存在的:
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
和下面的圖也能對應起來:
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
一個Worker上預設一個executor,也可以多個executor,如果只有一個executor的時候CPU利用率不高,則可以配置多個。
無論Spark有多少作業,都是在註冊的時候分配的資源。預設資源的分配方式,在每個Worker上為當前程式分配一個executorbackend,且預設情況下會最大化的使用cores和memory。如果不加限制,Spark一旦運行,直接把資源佔滿,這個時候就需要yarn或者mesos等資源管理員。
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
task運行在executor上面:
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
一次能運行多少個並發的task,取決於當前的executor能夠使用的cores的數量。
sc.textFile("/historyserverforSpark/README.md", 3).flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_,1).cache
並行度也是繼承的
sc.textFile("/historyserverforSpark/README.md", 3).flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_).sortByKey().cache
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
3個並行作業被繼承了。
==========手動繪製Spark內部架構 ============
Master、Driver、Worker、Executor
/usr/local/spark/spark-1.6.0-bin-hadoop2.6/bin/spark-submit --class com.dt.spark.SparkApps.cores.WordCount_Cluster --master spark://Master:7077 /root/Documents/SparkApps/SparkAppsInJava.jar
提交作業,即drvier是由spark-submit來提交的
E xecutor裡面的線程 是否關心運行啥代碼?線程只是計算資源,所以由於線程不關心具體Task中運行什麼代碼,所以Task和Thread是解耦合的。所以Thread是可以被複用的。
具體運行什麼,通過Runner的介面來運行封裝的代碼的。
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
當叢集啟動的時候,首先啟動master進程,負責整個叢集資源的管理和分配,並接收作業的提交,且為作業分配計算資源。即每個工作節點,預設情況下都會啟動一個Worker Process來管理當前節點的memory、CPU等計算資源。並且向master彙報Worker還能夠正常工作。
當使用者作業提交給Master時,Master會為程式分配ID並分配計算資源,預設情況下為當前應用程式在每個Process分配一個GoarseGrainedExecutorBackend進程,該進程預設情況下會最大化的使用當前節點上的記憶體和CPU。
每個線程可以被複用執行多個task
每個appication都包含一個driver和多個executors,每個executor裡面啟動並執行多個
==========Spark Job的邏輯視圖解析 ============
整個叢集是master和worker節點,是master-slave結構
worker是worknode上的守護節點,worker節點上有work process
work process會為接收master的指令,為當前要啟動並執行應用程式分配GoarseGrainedExecutorBackend進程
worker process會不會管理計算資源?不會。worker process 知識走一趟形式,看上去是它管理的資源,但是真正管理資源的是master!!!master管理每台機器上的計算資源的。
Drvier裡面有main方法,有SparkContext。。。
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
資料在stage內部是流過去的。一個stage裡面有多個transformation
==========Spark Job的物理視圖解析 ============
中,stage5是stage6的mapper。stage6是stage5的reducer.
Spark是一個更加精緻和更加高效的Map Reduce思想的具體實現。
最後一個stage裡面的task是result task類型,前面的所有stage中的task的類型都是shuffleMapTask類型的
stage裡面的內容一定是在executor中執行的。
而且stage必須是從前往後執行。
Spark的一個應用程式,可以為不同的Action產生眾多的Job,每個Job至少有一個Stage
本講課程的重要作用:鞏固前面的重要內容,且開啟下面Spark的密碼之旅。
王家林老師名片:
中國Spark第一人
新浪微博:http://weibo.com/ilovepains
公眾號:DT_Spark
部落格:http://blog.sina.com.cn/ilovepains
手機:18610086859
QQ:1740415547
郵箱:[email protected]
本文出自 “一枝花傲寒” 部落格,謝絕轉載!
從Spark架構中透視Job(DT大資料夢工廠)