Spark on Yarn 部分一原理及使用
Spark on Yarn
首先這部分分為原始碼部分以及例項部分,例子中包括最基本的通過spark-submit提交以及程式中提交yarn
這裡僅僅說明Spark on Yarn的第一部分,分為三塊:
- 原理
- spark-submit提交yarn程式
- IDEA程式碼提交yarn程式
1 原理
Spark yarn 模式有兩種, yarn-client, yarn-cluster, 其中yarn-client適合測試環境, yarn-cluster適合生產環境。
在詳細說明Yarn模式之前, 需要先了解幾個名詞
ResourceManager: 整個叢集只有一個, 負責叢集資源的統一管理和排程, 因為整個叢集只有一個,所以也有單點問題,
NodeManager: 它可以理解為叢集中的每一臺slave
AM: application master, 對於每一個應用程式都有一個AM, AM主要是向RM申請資源(資源其實就是Container, 目前這個Container就是cpu cores, memory), 然後在每個NodeManager上啟動Executors(進一步分佈資源給內部任務), 監控跟蹤應用程式的程式等。
這裡就引入了YARN的排程框架問題: 雙層排程框架
(1)RM統一管理叢集資源,分配資源給AM
(2)AM將資源進一步分配給Tasks
1.1 Yarn-cluster模式
![2778947-a75a27921b4407d6.png](https://i.iter01.com/images/70a56a6e8735e9277ddf06e55983a66068994ef654251f88e6963c507620521c.png)
下面來具體說說Spark Yarn Cluster的流程:
(1) Client端啟動應用程式,提交APP到YARN RM
(2)RM收到請求之後, 就會在叢集中隨機選擇一個NM, 為該應用程式分配第一個Container, 然後在這個Contaiiner上啟動AM,AM則實現了SC等的初始化
(3)AM啟動時會向RM註冊,並向RM申請資源
(4)AM一旦申請到資源也就是Container之後, 會在對應的Container(Container資訊裡面會包含NM節點資訊)啟動Executor
(5)AM的SC會分配任務及給Executor進行執行(之前Executor會去向AM中的SC註冊), 同時EXecutor會向AM彙報執行的狀態和進度,也就是上面綠色的通訊
(6)AM向RM註冊之後, AM會定時向RM彙報程式的執行狀態等資訊,也就是上面紅色部分的通訊。
1.2 Yarn-client
![2778947-6e4f7245dd000b3f.png](https://i.iter01.com/images/14332517ae16adec981c5a12fea0160cfe6d878f39dd33c97d1560300cc58988.png)
其具體流程和上面的yarn-cluster很類似
(1) Client端啟動應用程式,提交APP到YARN RM, 這個過程則涉及到SC的初始化,SC啟動時會去初始化DAGScheduler排程器, 使用反射方法去初始化YarnScheduler 和 YarnClientSchedulerBackend,最終Client會去向RM申請啟動AM
(2)RM收到請求之後, 就會在叢集中隨機選擇一個NM, 為該應用程式分配第一個Container, 然後在這個Contaiiner上啟動AM,AM則實現了SC等的初始化, 此處與yarn-cluster不同的是,SC的初始化驅動程式的啟動並不在AM中, 也就是AM並不是Driver端,但是AM會和SC通訊來獲取其需要的資源情況(多少cpu, 多少memory)
(3)當客戶端的SC與AM啟動完畢,會通訊, AM可知道SC需要的資源情況, 然後AM會向RM註冊, 並向RM申請資源Container
(4)AM申請到資源Container之後, 會與COntainer對應的NodeManager通訊, 要求他在其Container裡面啟動Executor, 然後去向客戶端的SparkContext註冊, 並申請任務集Tasks
(5)客戶端的SC分配任務集給Executor,
(6)應用程式執行結束之後,客戶端的SC會向RM申請資源釋放並去關閉自己,kill程式等
上面的流程介紹完之後, 來對比一下YARN-CLUSTER 與 yarn-client的區別:
其主要區別的是AM的作用不大一樣,
yarn-client模式下:AM僅僅向RM請求資源, 然後AM會在對應的Container中要求其所屬NodeManager去啟動Executor, Client會去與此Container Executor通訊, 也就是整個程式執行過程中, Client不能離開
yarn-cluster模式: Driver執行在AM中,也就是SC與Executor的所有通訊操作都與Client無關了, 在提交完應用程式之後,Client就可以離開了。
2 spark-submit提交到yarn
首先安裝好Hadoop 並配置好Yarn, 之後啟動sbin/start-yarn.sh
其次針對Spark的spark-env.sh裡面增加:
export HADOOP_CONF_DIR=/home/kason/bigdata/hadoop-2.7.4/etc/hadoop
export YARN_CONF_DIR=/home/kason/bigdata/hadoop-2.7.4/etc/hadoop
下面說明一個最基本的應用程式
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object SparkDemo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("SparkDEMO")
val sc: SparkContext = new SparkContext(conf)
val dataRDD: RDD[Int] = sc.parallelize(Array(1,2,3,4))
dataRDD.foreach(print)
print(dataRDD.count())
}
}
通過maven編譯成jar包, 然後通過spark-shell去提交此jar包到yarn上
./bin/spark-submit --class SparkDemo --master yarn --deploy-mode cluster --driver-memory 1G --executor-memory 1G --executor-cores 1 /home/kason/workspace/BigdataComponents/SparkLearn/target/SparkLearn-1.0-SNAPSHOT.jar
提交之後顯示:
![2778947-74f000fda55b45a0.png](https://i.iter01.com/images/c34ad37fc1ad95bfa6393691bb810334dbdfc83819b105617f4a35d96eaee989.png)
![2778947-02442c889863337d.png](https://i.iter01.com/images/13be0b0b02070ec862205966eef30a1bfb3435100e7b1dab2fef6b6b1c6d4492.png)
根據Yarn上的application id找到對應日誌:
![2778947-394360f65cdb29ff.png](https://i.iter01.com/images/848ed21b094cdff0af47ba526491dba93772cc164620b29d9589087646f0c7c0.png)
3 IDEA程式碼提交到yarn
通過IDEA實現程式碼提交其實很簡單, 主要是設定Master, Yarn模式不像mesos以及standalone模式通過傳輸url來實現資源管理, yarn模式實際上是Hadoop Yarn接管資源管理,具體程式碼如下:
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object SparkDemo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("SparkDEMO")
.setMaster("yarn")
//.setMaster("spark://kason-pc:7077")
.set("spark.yarn.jars","hdfs://kason-pc:9000/system/spark/yarn/jars/*")
.setJars(List("/home/kason/workspace/BigdataComponents/out/artifacts/SparkLearn_jar/SparkLearn.jar"))
//.setJars(GETJars.getJars("/home/kason/workspace/BigdataComponents/spark-main/target/spark-main/WEB-INF/lib"))
val sc: SparkContext = new SparkContext(conf)
val dataRDD: RDD[Int] = sc.parallelize(Array(1,2,3,4))
val result = dataRDD.map(res => res * 2)
result.collect().foreach(println(_))
print(result.count())
}
}
執行spark之後, 去8088yarn頁面去檢視一下:
![2778947-b8057c02588496f5.png](https://i.iter01.com/images/8ff3fbd83a72795254a88750224a5c306c72f11b15dc8d2ab7d1a320d5e0851c.png)
注意IDEA程式碼提交到yarn只能使用yarn-client模式
相關文章
- Spark on Yarn 和Spark on MesosSparkYarn
- 12 Spark on YARNSparkYarn
- Spark on Yarn 實踐SparkYarn
- Spark:Yarn-client與Yarn-clusterSparkYarnclient
- Spark 以及 spark streaming 核心原理及實踐Spark
- 搭建spark on yarn 叢集SparkYarn
- spark 與 yarn 結合SparkYarn
- Spark 原始碼系列(七)Spark on yarn 具體實現Spark原始碼Yarn
- Yarn執行原理Yarn
- Spark原始碼解析-Yarn部署流程(ApplicationMaster)Spark原始碼YarnAPPAST
- 部署Spark2.2叢集(on Yarn模式)SparkYarn模式
- Spark UI (基於Yarn) 分析與定製SparkUIYarn
- Hadoop Yarn框架原理解析HadoopYarn框架
- 解析HetuEngine實現On Yarn原理Yarn
- LruCache 使用及原理
- Docker使用及原理Docker
- @Inner使用及原理
- Spark的工作原理Spark
- Linux環境Spark安裝配置及使用LinuxSpark
- cdh版spark on yarn與idea直連操作sql遇到的一些問題SparkYarnIdeaSQL
- YUM工作原理及使用
- Flutter Hooks 使用及原理FlutterHook
- Paging Library使用及原理
- Express的使用及原理Express
- 使用yarn代替npmYarnNPM
- 架構安全性設計、部分示例及原理分析架構
- Spark in action on Kubernetes - Spark Operator的原理解析Spark
- Spark的執行原理Spark
- Spark Streaming :基本工作原理Spark
- spark執行原理、模型Spark模型
- KVO使用及實現原理
- nodeJs流的使用及原理NodeJS
- TL431原理及使用
- mydumper使用及原理淺析
- Java集合 ArrayList原理及使用Java
- MySQL的索引原理及使用MySql索引
- Spark原理-物理執行圖Spark
- spark-submit提交到yarn中執行的log怎麼看?SparkMITYarn
- Flutter Stream 簡介及部分操作符使用Flutter