與其餘計算框架共享集羣資源(eg.Spark框架與MapReduce框架同時運行,若是不用Yarn進行資源分配,MapReduce分到的內存資源會不多,效率低下);資源按需分配,進而提升集羣資源利用率等。node
相較於Spark自帶的Standalone模式,Yarn的資源分配更加細緻web
Application部署簡化,例如Spark,Storm等多種框架的應用由客戶端提交後,由Yarn負責資源的管理和調度,利用Container做爲資源隔離的單位,以它爲單位去使用內存,cpu等。緩存
Yarn經過隊列的方式,管理同時運行在Yarn集羣中的多個服務,可根據不一樣類型的應用程序負載狀況,調整對應的資源使用量,實現資源彈性管理。安全
Client做爲提交分佈式程序的客戶端,上傳資源文件和JAR包到HDFS提供集羣使用通常是client實現的。客戶端除了能夠直接從RM獲得App Master的消息,獲得做業的運行狀況外,還能夠直接與App Master溝通。網絡
ResourceManager負責將集羣的資源分配給各個應用使用。多線程
Container做爲資源分配和調度的基本單位,其中封裝了的資源如內存,CPU,磁盤,網絡帶寬等。每一個任務會被分配一個Container,並在該Container中執行且只能使用其封裝的資源。app
NodeManager做爲計算節點,負責啓動Container,同時經過心跳不斷的和RM溝通,描述該Worker節點的資源( CPU,內存,硬盤和網絡帶寬等)情況。框架
AppMaster 對應客戶端提交的一個應用,客戶端每提交一個應用,RM會在Worker節點上給它分配一個全局惟一的App master,App master能夠在任何一臺Worker節點上啓動,負責管理做業的整個生命週期,包括通知NM建立Container,管理Container等。分佈式
Yarn能夠在History Server中查看運行了那些做業,在Hadoop將來版本中還能夠經過Histort Server中瞭解App Master的工做(調度)細節(eg.使用哪臺機器上的CPU,內存,處理了什麼數據等)。oop
1. RM收到客戶端的請求後,會在全局查看資源,若是哪臺Worker適合,其上運行的NM就爲該做業生成container實例,生成的第一個Container實例,裏面運行的就是App Master,App Master運行成功的時候要向RM進行註冊。
2. App Master向RM申請資源(eg.10個Container),獲得消息反饋後,控制NM啓動Container並運行任務,Container啓動後直接對App Master負責(做業的調度中心是App Master,極大的減輕的RM的負擔)。
Tip:若是沒有足夠的container能夠被申請,則會進行等待其餘做業完成任務,空出Container後進行分配。
3.App Master監控容器上任務的執行狀況,反饋在做業的執行狀態信息和完成狀態。
Spark on Yarn框架圖
Yarn提到的App Master能夠理解爲Spark中Standalone模式中的driver。
Container中運行着Executor,在Executor中以多線程並行的方式運行Task。
工做流程大致與Yarn相同。
使用該模式的時候,需修改$SPARK_HOME/conf/spark-env文件,在文件中加入HADOOP_CONF_DIR 或者 YARN_CONF_DIR路徑指向含有客戶端配置文件的目錄。這些配置會被寫入分佈式文件系統,YARNResourceManager會連接它們。
//HADOOP目錄
export HADOOP_HOME=/usr/local/hadoop
//HADOOP下配置文件目錄
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
Sparkon Yarn 模式又分爲Yarn-Cluster模式和Yarn-Client模式。
Spark-Cluster模式中,driver程序會在application master進程中運行,客戶端程序能夠在應用初始化後脫離。Spark-Client模式中,driver運行在client進程中,client通常不是集羣中的機器。applicationmaster僅用於向YARN請求資源。調試時通常使用yarn-client模式,便於任務進行過程和結果(log)的查看。
在yarn-cluster模式下啓動Spark Application
列出一些經常使用的參數:
num-executors是executor的數量
driver-memory 是爲driver分配的內存
executor-memory 是每一個executor使用的內存
executor-cores 是每一個executor分配的CPU
示例:
結果:
能夠去ResourceManager的web ui 默認端口8088中查看結果,也能夠直接去Worker節點的log下查看。
使用方式除了--master 參數改成yarn-client外,其餘基本與yarn-cluster相同
執行過程和結果都會在控制檯打印出來,這是由於driver運行在客戶端中:
提交任務後,能夠在Yarn的ResourceManager對應的Web UI(默認端口爲8088)中查看該Application的狀態和對應的日誌。
Executors和app master都運行在container中。應用完成運行後,YARN有兩種處理container日誌的模式:
1.若是開啓了日誌聚合(經過yarn.log-aggregation-enable配置),container的日誌會複製到HDFS中而且刪除機器上的本地日誌。這樣能夠經過」yarn logs」命令在集羣中的任意地方進行查看。
yarn logs -applicationId <app ID>
運行上述命令會打印出指定應用全部container的日誌內容。
2.若是日誌聚合是關閉的,日誌會保存在每一臺機器的目錄YARN_APP_LOGS_DIR下,一般配置爲$HADOOP_HOME/logs/userlogs。查看某個container的日誌須要在對應主機的那些目錄下進行。子目錄會根據Application ID以及Container ID來肯定。
屬性名 |
默認值 |
說明 |
spark.yarn.applicationMaster.waitTries |
10 |
ApplicationMaster允許SparkContext初始化失敗的最大次數 |
spark.yarn.submit.file.replication |
3 |
Spark和APP的JAR文件以及其餘分佈式存儲的文件、 壓縮包上傳到HDFS中的副本數量 |
spark.yarn.preserve.staging.files |
false |
設置是否在本次Job運行完成後 刪除使用到的文件(Spark和App的jar文件等) |
spark.yarn.scheduler.heartbeat.interval-ms |
5000 |
Spark application master向YARN心跳彙報的間隔 |
spark.yarn.max.executor.failures |
2*executor數量,最小爲3 |
在Application失敗前,executor的最大失敗次數 |
spark.yarn.historyServer. address |
none |
Spark歷史任務的地址(例如:host.com:18080),不要 包含協議頭(http://)。 當Spark應用執行執行完成時,YARN ResourceManager 能夠經過這個地址將ResourceManager UI和 Spark 歷史任務 UI連接。 |
spark.yarn.dist.archives |
none |
將要解壓到每一個executor工做目錄下的壓縮包用逗號分隔。 |
spark.yarn.dist.files |
none |
將要放置在每一個executor工做目錄下的文件用逗號分隔 |
spark.yarn.executor.memoryOverhead |
384 |
每一個executor能夠分配的非堆存儲(off-heap)內存, 這些內存用於如VM, 字符串常量池以及其餘本地額外開銷等。 |
spark.yarn.driver.memoryOverhead |
384 |
每一個driver能夠分配的非堆存儲(off-heap)內存, 這些內存用於如VM, 字符串常量池以及其餘本地額外開銷等。 |
spark.yarn.jar |
none |
修改讀取spark jar的地址, Spark on Yarn默認使用安裝在本地的Spark jar文件, 可是該文件也能夠放在HDFS上任意能夠訪問到的位置。 YARN能夠將他緩存在節點上, 這樣就沒必要在應用每次運行時再分發。 用法:能夠經過」hdfs:///some/path」來指定HDFS上的jar文件。 |
spark.yarn.access.namenodes |
none |
你的Spark Application將要去鏈接的一個安全的 HDFS nameNodes列表。例如: `spark.yarn.access.namenodes= hdfs://nn1.com:8032,hdfs://nn2.com:8032`。 Spark Application首先要能訪問訪問該列表中 指定的namenode,Spark獲取到每一個namenode的安全令牌, 這樣Spark Application就能訪問那些遠程的HDFS集羣。 |
spark.yarn.appMasterEnv. [EnvironmentVariableName] |
none |
將環境變量經過EnvironmentVariableName添加到YARN上啓 動的Application Master進程。 用戶能夠指定多個這樣的配置來設置多個環境變量。 在yarn-cluster模式中控制Spark driver的環境變量, 在yarn-client模式中只能控制executor啓動的環境變量。 |
Hadoop2.2以前,YARN不支持爲container資源分配核心數。
Sparkexecutor使用的本地目錄由YARN的配置肯定(Hadoop YARN配置yarn.nodemanager.local-dirs)。即便用戶在spark配置文件中指定了spark.local.dir也會被忽略。
在yarn-cluster模式下,若是你使用本地文件,參數選項--jars能使代碼中的SparkContext.addJar的功能生效。若是使用的是HDFS,HTPP,HTTPS或FTP文件則不須要--jars參數。