1. 程式人生 > >spark 的各種引數配置

spark 的各種引數配置

 

2018年01月03日 11:19:46 hankl1990 閱讀數:1784

https://www.jianshu.com/p/9b243c0a7410

 

 

 

1 spark on yarn常用屬性介紹

屬性名 預設值 屬性說明
spark.yarn.am.memory 512m 在客戶端模式(client mode)下,yarn應用master使用的記憶體數。在叢集模式(cluster mode)下,使用spark.driver.memory
代替。
spark.driver.cores 1 在叢集模式(cluster mode)下,driver程式使用的核數。在叢集模式(cluster mode)下,driver程式和master執行在同一個jvm中,所以master控制這個核數。在客戶端模式(client mode)下,使用spark.yarn.am.cores控制master使用的核。
spark.yarn.am.cores 1 在客戶端模式(client mode)下,yarn應用的master使用的核數。在叢集模式下,使用spark.driver.cores
代替。
spark.yarn.am.waitTime 100ms 在叢集模式(cluster mode)下,yarn應用master等待SparkContext初始化的時間。在客戶端模式(client mode)下,master等待driver連線到它的時間。
spark.yarn.submit.file.replication 3 檔案上傳到hdfs上去的replication次數
spark.yarn.preserve.staging.files false 設定為true
時,在job結束時,保留staged檔案;否則刪掉這些檔案。
spark.yarn.scheduler.heartbeat.interval-ms 3000 Spark應用masteryarn resourcemanager之間的心跳間隔
spark.yarn.scheduler.initial-allocation.interval 200ms 當存在掛起的容器分配請求時,spark應用master傳送心跳給resourcemanager的間隔時間。它的大小不能大於spark.yarn.scheduler.heartbeat.interval-ms,如果掛起的請求還存在,那麼這個時間加倍,直到到達spark.yarn.scheduler.heartbeat.interval-ms大小。
spark.yarn.max.executor.failures numExecutors * 2,並且不小於3 在失敗應用程式之前,executor失敗的最大次數。
spark.executor.instances 2 Executors的個數。這個配置和spark.dynamicAllocation.enabled不相容。當同時配置這兩個配置時,動態分配關閉,spark.executor.instances被使用
spark.yarn.executor.memoryOverhead executorMemory * 0.10,並且不小於384m 每個executor分配的堆外記憶體。
spark.yarn.driver.memoryOverhead driverMemory * 0.10,並且不小於384m 在叢集模式下,每個driver分配的堆外記憶體。
spark.yarn.am.memoryOverhead AM memory * 0.10,並且不小於384m 在客戶端模式下,每個driver分配的堆外記憶體
spark.yarn.am.port 隨機 Yarn 應用master監聽的埠。
spark.yarn.queue default 應用提交的yarn佇列的名稱
spark.yarn.jar none Jar檔案存放的地方。預設情況下,spark jar安裝在本地,但是jar也可以放在hdfs上,其他機器也可以共享。

2 客戶端模式和叢集模式的區別

這裡我們要區分一下什麼是客戶端模式(client mode),什麼是叢集模式(cluster mode)。

我們知道,當在YARN上執行Spark作業時,每個Spark executor作為一個YARN容器(container)執行。Spark可以使得多個Tasks在同一個容器(container)裡面執行。 yarn-clusteryarn-client模式的區別其實就是Application Master程序的區別,在yarn-cluster模式下,driver執行在AM(Application Master)中,它負責向YARN申請資源,並監督作業的執行狀況。當用戶提交了作業之後,就可以關掉Client,作業會繼續在YARN上執行。然而yarn-cluster模式不適合執行互動型別的作業。 在yarn-client模式下,Application Master僅僅向YARN請求executorclient會和請求的container通訊來排程他們工作,也就是說Client不能離開。下面的圖形象表示了兩者的區別。

1.1

1.1

1.2

1.2

2.1 Spark on YARN叢集模式分析

2.1.1 客戶端操作

  • 1、根據yarnConf來初始化yarnClient,並啟動yarnClient
  • 2、建立客戶端Application,並獲取ApplicationID,進一步判斷叢集中的資源是否滿足executorApplicationMaster申請的資源,如果不滿足則丟擲IllegalArgumentException
  • 3、設定資源、環境變數:其中包括了設定ApplicationStaging目錄、準備本地資源(jar檔案、log4j.properties)、設定Application其中的環境變數、建立Container啟動的Context等;
  • 4、設定Application提交的Context,包括設定應用的名字、佇列、AM的申請的Container、標記該作業的型別為Spark
  • 5、申請Memory,並最終通過yarnClient.submitApplicationResourceManager提交該Application

當作業提交到YARN上之後,客戶端就沒事了,甚至在終端關掉那個程序也沒事,因為整個作業執行在YARN叢集上進行,執行的結果將會儲存到HDFS或者日誌中。

2.1.2 提交到YARN叢集,YARN操作

  • 1、執行ApplicationMasterrun方法;
  • 2、設定好相關的環境變數。
  • 3、建立amClient,並啟動;
  • 4、在Spark UI啟動之前設定Spark UIAmIpFilter
  • 5、在startUserClass函式專門啟動了一個執行緒(名稱為Driver的執行緒)來啟動使用者提交的Application,也就是啟動了Driver。在Driver中將會初始化SparkContext
  • 6、等待SparkContext初始化完成,最多等待spark.yarn.applicationMaster.waitTries次數(預設為10),如果等待了的次數超過了配置的,程式將會退出;否則用SparkContext初始化yarnAllocator
  • 7、當SparkContext、Driver初始化完成的時候,通過amClientResourceManager註冊ApplicationMaster;
  • 8、分配並啟動Executeors。在啟動Executeors之前,先要通過yarnAllocator獲取到numExecutorsContainer,然後在Container中啟動Executeors。 如果在啟動Executeors的過程中失敗的次數達到了maxNumExecutorFailures的次數,maxNumExecutorFailures的計算規則如下:
 
  1. // Default to numExecutors * 2, with minimum of 3

  2. private val maxNumExecutorFailures = sparkConf.getInt("spark.yarn.max.executor.failures",

  3. sparkConf.getInt("spark.yarn.max.worker.failures", math.max(args.numExecutors * 2, 3)))

  4.  
  5.  

那麼這個Application將失敗,將Application Status標明為FAILED,並將關閉SparkContext。其實,啟動Executeors是通過ExecutorRunnable實現的,而ExecutorRunnable內部是啟動CoarseGrainedExecutorBackend的。

  • 9、最後,Task將在CoarseGrainedExecutorBackend裡面執行,然後執行狀況會通過Akka通知CoarseGrainedScheduler,直到作業執行完成。

2.2 Spark on YARN客戶端模式分析

yarn-cluster模式一樣,整個程式也是通過spark-submit指令碼提交的。但是yarn-client作業程式的執行不需要通過Client類來封裝啟動,而是直接通過反射機制呼叫作業的main函式。下面是流程。

  • 1、通過SparkSubmit類的launch的函式直接呼叫作業的main函式(通過反射機制實現),如果是叢集模式就會呼叫Clientmain函式。
  • 2、而應用程式的main函式一定都有個SparkContent,並對其進行初始化;
  • 3、在SparkContent初始化中將會依次做如下的事情:設定相關的配置、註冊MapOutputTracker、BlockManagerMaster、BlockManager,建立taskSchedulerdagScheduler
  • 4、初始化完taskScheduler後,將建立dagScheduler,然後通過taskScheduler.start()啟動taskScheduler,而在taskScheduler啟動的過程中也會呼叫SchedulerBackendstart方法。 在SchedulerBackend啟動的過程中將會初始化一些引數,封裝在ClientArguments中,並將封裝好的ClientArguments傳進Client類中,並client.runApp()方法獲取Application ID
  • 5、client.runApp裡面的做的和上章客戶端進行操作那節類似,不同的是在裡面啟動是ExecutorLauncheryarn-cluster模式啟動的是ApplicationMaster)。
  • 6、在ExecutorLauncher裡面會初始化並啟動amClient,然後向ApplicationMaster註冊該Application。註冊完之後將會等待driver的啟動,當driver啟動完之後,會建立一個MonitorActor物件用於和CoarseGrainedSchedulerBackend進行通訊(只有事件AddWebUIFilter他們之間才通訊,Task的執行狀況不是通過它和CoarseGrainedSchedulerBackend通訊的)。 然後就是設定addAmIpFilter,當作業完成的時候,ExecutorLauncher將通過amClient設定Application的狀態為FinalApplicationStatus.SUCCEEDED
  • 7、分配Executors,這裡面的分配邏輯和yarn-cluster裡面類似。
  • 8、最後,Task將在CoarseGrainedExecutorBackend裡面執行,然後執行狀況會通過Akka通知CoarseGrainedScheduler,直到作業執行完成。
  • 9、在作業執行的時候,YarnClientSchedulerBackend會每隔1秒通過client獲取到作業的執行狀況,並打印出相應的執行資訊,當Application的狀態是FINISHED、FAILEDKILLED中的一種,那麼程式將退出等待。
  • 10、最後有個執行緒會再次確認Application的狀態,當Application的狀態是FINISHED、FAILEDKILLED中的一種,程式就執行完成,並停止SparkContext。整個過程就結束了。

3 spark submit 和 spark shell引數介紹

引數名 格式 引數說明
--master MASTER_URL spark://host:port
--deploy-mode DEPLOY_MODE Client或者master,預設是client
--class CLASS_NAME 應用程式的主類
--name NAME 應用程式的名稱
--jars JARS 逗號分隔的本地jar包,包含在driver和executor的classpath下
--packages   包含在driver和executor的classpath下的jar包逗號分隔的”groupId:artifactId:version”列表
--exclude-packages   用逗號分隔的”groupId:artifactId”列表
--repositories   逗號分隔的遠端倉庫
--py-files PY_FILES 逗號分隔的”.zip”,”.egg”或者“.py”檔案,這些檔案放在python app的PYTHONPATH下面
--files FILES 逗號分隔的檔案,這些檔案放在每個executor的工作目錄下面
--conf PROP=VALUE 固定的spark配置屬性
--properties-file FILE 載入額外屬性的檔案
--driver-memory MEM Driver記憶體,預設1G
--driver-java-options   傳給driver的額外的Java選項
--driver-library-path   傳給driver的額外的庫路徑
--driver-class-path   傳給driver的額外的類路徑
--executor-memory MEM 每個executor的記憶體,預設是1G
--proxy-user NAME 模擬提交應用程式的使用者
--driver-cores NUM Driver的核數,預設是1。這個引數僅僅在standalone叢集deploy模式下使用
--supervise   Driver失敗時,重啟driver。在mesos或者standalone下使用
--verbose   列印debug資訊
--total-executor-cores NUM 所有executor總共的核數。僅僅在mesos或者standalone下使用
--executor-core NUM 每個executor的核數。在yarn或者standalone下使用
--driver-cores NUM Driver的核數,預設是1。在yarn叢集模式下使用
--queue QUEUE_NAME 佇列名稱。在yarn下使用
--num-executors NUM 啟動的executor數量。預設為2。在yarn下使用

你可以通過spark-submit --help或者spark-shell --help來檢視這些引數。

參考文獻

【1】Spark:Yarn-cluster和Yarn-client區別與聯絡

【2】Spark on YARN客戶端模式作業執行全過程分析

【3】Spark on YARN叢集模式作業執行全過程分析