Spark文件閱讀之一:Spark Overview

沙木魚發表於2020-06-15
版本:2.4.5
 

1. spark的幾種執行方式

1)互動式shell:bin/spark-shell
bin/spark-shell --master <MasterURL> 可配置不同的執行器
 
例如:
bin/spark-shell --master local    # 本地單worker執行
bin/spark-shell --master local[K]    # 本地K個worker執行,K為"*"(星號)時表示本機CPU核數
bin/spark-shell --master local[K, F]    # spark.task.maxFailures = F,單個task失敗F次後job失敗,即task可以重試最多F-1次
bin/spark-shell --master spark://HOST:PORT    # 連線已有的standalone cluster,standalone模式就是手動部署一個測試用的叢集,包含master和slave,可以為單機環境(standalone模式使用說明:https://spark.apache.org/docs/latest/spark-standalone.html)(standalone有client模式和cluster模式。client模式中driver和提交任務的client在一個程式中;而cluster模式中driver在cluster的一個worker中執行,client提交任務後就結束退出了,另外cluster模式還以配置為任務非0退出後立即重跑。)
bin/spark-shell --master spark://host1:port1,host2:port2    # 連線已有的基於ZK的standalone master(有多個master,其中一個是leader,掛了以後其他master恢復狀態並上位)
bin/spark-shell --master mesos://host:port    # 連線已有的Mesos cluster(沒細看)
bin/spark-shell --master yarn    # 連線一個Yarn叢集,可以配置 --deploy-mode client/cluster (yarn的地址從hadoop配置中讀取,不需要在命令中指定)
bin/spark-shell --master k8s://host:port    # 連線一個kubernetes叢集(目前不支援client模式)

 

2)python: bin/pyspark & bin/spark-submit xx.py
3)R:bin/sparkR & bin/spark-submit xx.R

 

2. 任務的提交

spark-submit可以將任務提交到一個叢集上,並且有統一的介面支援所有cluster manager(standalone、mesos、yarn、kubernetes)。
打包任務所有的依賴到一個jar包中,或者使用--py-files引數提交.py、.zip、.egg檔案(多個檔案需打包為一個.zip)
 
bin/spark-submit \
  --class <main-class> \  # 任務入口
  --master <master-url> \  # 支援多種cluster manager
  --deploy-mode <deploy-mode> \  # cluster / client,預設為client
  --conf <key>=<value> \
  ... # other options,如--supervise(非0退出立即重啟), --verbose(列印debug資訊), --jars xx.jar(上傳更多的依賴,逗號分隔,不支援目錄展開)
  <application-jar> \  # main-class來自這個jar包,必須是所有節點都可見的路徑,hdfs://或file://
  [application-arguments]  # 入口函式的引數
  
bin/spark-submit \
  --master <master-url> \
  <application-python> \
  [application-arguments]
 
* 關於cluster / client模式:
如果任務提交機和worker執行機在同一個物理位置,可以用client模式;如果不再同一個位置,可以用cluster模式,讓driver和worker一起執行,減少網路延遲。另外python沒有standalone cluster模式。
* 很多配置可以放在spark-defaults.conf中,就不用在spark-submit中重複配置了
 

3. cluster模式

spark任務在叢集上作為一個獨立的資源集合執行,由driver的SparkContext物件進行管理。為了在叢集上執行,SparkContext連線cluster manager讓它來分配任務資源。一旦連線,spark從叢集節點獲取executors,用來進行計算和儲存資料。之後,spark傳送任務程式碼(jar或python)到executors中。最後,SparkContext傳送tasks到executors執行。
 

 
另外,有幾點細節值得一提:
1)每個任務的executors是獨佔的,在整個任務執行期間存活。這使得不同任務間的資源管理更容易,互不干擾;同時導致同一任務的不同executors無法共享資料,除非寫到外部儲存中。
2)spark不限定下層的cluster manager種類,只要cluster manager可以獲取executor資源,並且executors可以互相通訊,就可以在spark中輕鬆使用。
3)driver在整個生命週期中都需要不斷與executors通訊,因此必須能夠被workers訪問。
4)因為driver排程叢集中的tasks,他必須在物理上離executors儘可能近,最好在同一個本地網路中。
 
cluster模式即可以從任務層面對資源進行排程(依賴SparkContext/Driver),也可以從叢集層面進行排程(依賴cluster manager)。
 
術語表
術語
含義
Application
任務,使用者的spark程式,包含位於叢集的一個driver和多個executors
Application jar
一個包含使用者spark任務和依賴的jar包,不應包含hadoop或spark庫
Driver program
任務main()函式和SparkContext所在的程式
Cluster manager
獲取叢集資源的外部服務
Deploy mode
用來區分driver程式在cluster還是client(即非cluster機器)上執行
Worker node
任何可以跑任務程式碼的節點
Executor
在worker node上載入並執行了使用者任務的一個程式,它執行了tasks並且在記憶體或儲存中儲存資料,每個application獨佔它自己的executors
Task
一組被髮送到一個executor的工作
Job
一個多tasks的平行計算單元,對應一個spark操作(例如save, collect)
Stage
每個job可以劃分成的更小的tasks集合,類似MapReduce中的map/reduce,stages相互依賴
 
* 看過spark日誌應該能夠理解這些概念,save、collect等各是一個job,一個job會被劃分成多個stages
 

相關文章