Spark開發-Yarn cluster模式

Xlucas發表於2017-11-05

1、部署及程式執行
YARN cluster模型,顧名思義就是通過Hadoop YARN框架來排程spark應用所需的資源,要將Spark叢集執行在YARN模式下,首先需要部署一個YARN叢集提供該模式使用,在實際應用中,這兩者的因果關係往往是反過來的,這是因為使用者有一個Hadoop YARN叢集,因此希望將spark也納入YARN的排程管理中,這樣有利於系統的資源共享,
打包
對於spark來說,需要做的準備工作包括通過sbt assembly 命令將所有的依賴關係打成一個大的jar包供YARN排程框架使用,以Hadoop2.6為例,這個jar包可以通過如下命令獲得
SPARK_HADOOP_VERSION=2.6.0 SPARK_YARN=true sbt/sbt assembly
所獲得的jar包,可以上傳到HDFS中,也可以放在本地,同樣的,你的應用程式本身也需要打包成jar包供YARN排程框架使用。
配置
對於YARN模式來說,還有一些特定的引數可以通過conf檔案或者程式設計直接配置,用於調整執行時的行為,如下所示
1、spark.yarn.applicationMaster.waitTries:嘗試等待spark master啟動和初始化完成的次數,預設為10
2、spark.yarn.submit.file.replication:spark應用程式的依賴檔案上傳到HDFS時,在HDFS中的備份的拷貝數量,這些檔案包括spark的jar包,應用程式的jar包,其他作為distribute cache使用的檔案等,通常,如果你的叢集節點數越多,相應地就需要設定越多的拷貝數以加快這些檔案的分發
3、spark.yarn.preserve.staging.files:在應用程式結束後是否保留上述上傳的檔案
4、spark.yarn.scheduler.heartbeat.interval-ms:spark application master向YARN resourcemanager 傳送心跳的時間間隔,預設是5秒
5、spark.yarn.max.worker.failures:在認為一個應用程式執行失敗之前,允許執行失敗的worker的最大數量
在YARN cluster模式下,需要通過額外的輔助程式來啟動應用,其啟動方式如下

SPARK_JAR=<SPARK_ASSEMBLY_JAR_FILE> ./bin/spark-class org.apache.spark.deploy.yarn.Client \
--jar <YOUR_APP_JAR_FILE> \
--class <APP_MAIN_CLASS> \
--args <APP_MAIN_ARGUMENTS> \
--num-workers <NUMBER_OF_WORKER_MACHINES> \
--master-class <ApplicationMaster_CLASS> \
--master-memory <MEMORY_FOR_MASTER> \
--worker-memory <MEMORY_PER_WORKER> \
--worker-cores <CORES_PER_WORKER> \
--name <application_name> \
--queue <queue_name> \
--addJars <any_local_files_used_in_SparkContext.addJar> \
--files <files_for_distributed_cache> \
--archives <archives_for_distributed_cache>

內部實現原理
下圖是YARN cluster 模式原理框圖,相對於其他模式有些特殊,它需要由外部程式輔助啟動APP,使用者的應用程式通過輔助的YARN client類啟動
client類通過YARN client api提交請求在Hadoop叢集上啟動一個spark applicationmaster,spark applicationmaster首先註冊自己為一個YARN applicationmaster ,之後啟動使用者程式,sparkcontext在使用者程式中初始化時,使用coarseGrainedSchedulerBackend配合YARNClusterScheduler,YARNClusterScheduler只是對TaskScheduler的一個簡單包裝,增加了對executor的等待邏輯等
根據client類傳遞的引數,spark applicationmaster 通過YARN resourcemanager/nodemanager的介面在叢集中啟動若干個container,用於執行coarseGrainedExecutorBackend。coarseGrainedExecutorBackend在啟動過程中會向coarseGrainedSchedulerBackend註冊,之後的任務排程流程同上述其他cluster模式
這裡寫圖片描述

相關文章