1. 程式人生 > >spark學習記錄(六、基礎知識)

spark學習記錄(六、基礎知識)

1.術語解釋

2.SparkCore和SparkSQL知識點思維導圖整理

https://download.csdn.net/download/qq_33283652/10890863 

3.RDD的寬窄依賴

相同的key去同一個分割槽,但一個分割槽可以用不同的key

RDD窄依賴:

父RDD與子 RDD partition之間的關係是一對一或多對一,例如rdd1與rdd2,rdd2與rdd3

RDD寬依賴(shuffle):

父RDD與子 RDD partition之間的關係是一對多,例如rdd3與rdd4

4.stage

 partition中儲存的是處理邏輯,不存資料

spark處理資料模式(pipeline計算模式):

rdd1取出一條資料處理,將結果傳給rdd2,rdd2處理後傳給rdd3,rdd3處理後存入磁碟中,然後rdd1再取出一條資料處理,直到處理完所有資料。

擴充套件:

  • Stage的並行度由finalRDD的partition個數決定。
  • 管道中的資料在shuffle write和RDD持久化時寫入磁碟中

5.Spark資源排程和任務排程的流程 

啟動集群后,Worker節點會向Master節點彙報資源情況,Master掌握了叢集資源情況。當Spark提交一個Application後,根據RDD之間的依賴關係將Application形成一個DAG有向無環圖。任務提交後,Spark會在Driver端建立兩個物件:DAGScheduler和TaskScheduler,DAGScheduler是任務排程的高層排程器,是一個物件。DAGScheduler的主要作用就是將DAG根據RDD之間的寬窄依賴關係劃分為一個個的Stage,然後將這些Stage以TaskSet的形式提交給TaskScheduler(TaskScheduler是任務排程的低層排程器,這裡TaskSet其實就是一個集合,裡面封裝的就是一個個的task任務,也就是stage中的並行度task任務),TaskSchedule會遍歷TaskSet集合,拿到每個task後會將task傳送到計算節點Executor中去執行(其實就是傳送到Executor中的執行緒池ThreadPool去執行)。task在Executor執行緒池中的執行情況會向TaskScheduler反饋,當task執行失敗時,則由TaskScheduler負責重試,將task重新發送給Executor去執行,預設重試3次。如果重試3次依然失敗,那麼這個task所在的stage就失敗了。stage失敗了則由DAGScheduler來負責重試,重新發送TaskSet到TaskSchdeuler,Stage預設重試4次。如果重試4次以後依然失敗,那麼這個job就失敗了。job失敗了,Application就失敗了。
TaskScheduler不僅能重試失敗的task,還會重試straggling(落後,緩慢)task(也就是執行速度比其他task慢太多的task)。如果有執行緩慢的task那麼TaskScheduler會啟動一個新的task來與這個執行緩慢的task執行相同的處理邏輯。兩個task哪個先執行完,就以哪個task的執行結果為準。這就是Spark的推測執行機制。在Spark中推測執行預設是關閉的。推測執行可以通過spark.speculation屬性來配置。 

注意:

  • 對於ETL型別要入資料庫的業務要關閉推測執行機制,這樣就不會有重複的資料入庫。
  • 如果遇到資料傾斜的情況,開啟推測執行則有可能導致一直會有task重新啟動處理相同的邏輯,任務可能一直處於處理不完的狀態。