Spark on Yarn 部分一原理及使用

Spark on Yarn

首先這部分分為源碼部分以及實(shí)例部分,例子中包括最基本的通過(guò)spark-submit提交以及程序中提交yarn
這里僅僅說(shuō)明Spark on Yarn的第一部分,分為三塊:

  • 原理
  • spark-submit提交yarn程序
  • IDEA代碼提交yarn程序

1 原理

Spark yarn 模式有兩種, yarn-client, yarn-cluster, 其中yarn-client適合測(cè)試環(huán)境, yarn-cluster適合生產(chǎn)環(huán)境。
在詳細(xì)說(shuō)明Yarn模式之前, 需要先了解幾個(gè)名詞
ResourceManager: 整個(gè)集群只有一個(gè), 負(fù)責(zé)集群資源的統(tǒng)一管理和調(diào)度, 因?yàn)檎麄€(gè)集群只有一個(gè),所以也有單點(diǎn)問(wèn)題,
NodeManager: 它可以理解為集群中的每一臺(tái)slave
AM: application master, 對(duì)于每一個(gè)應(yīng)用程序都有一個(gè)AM, AM主要是向RM申請(qǐng)資源(資源其實(shí)就是Container, 目前這個(gè)Container就是cpu cores, memory), 然后在每個(gè)NodeManager上啟動(dòng)Executors(進(jìn)一步分布資源給內(nèi)部任務(wù)), 監(jiān)控跟蹤應(yīng)用程序的進(jìn)程等。
這里就引入了YARN的調(diào)度框架問(wèn)題: 雙層調(diào)度框架
(1)RM統(tǒng)一管理集群資源,分配資源給AM
(2)AM將資源進(jìn)一步分配給Tasks

1.1 Yarn-cluster模式

Yarn-cluster

下面來(lái)具體說(shuō)說(shuō)Spark Yarn Cluster的流程:
(1) Client端啟動(dòng)應(yīng)用程序,提交APP到Y(jié)ARN RM
(2)RM收到請(qǐng)求之后, 就會(huì)在集群中隨機(jī)選擇一個(gè)NM, 為該應(yīng)用程序分配第一個(gè)Container, 然后在這個(gè)Contaiiner上啟動(dòng)AM,AM則實(shí)現(xiàn)了SC等的初始化
(3)AM啟動(dòng)時(shí)會(huì)向RM注冊(cè),并向RM申請(qǐng)資源
(4)AM一旦申請(qǐng)到資源也就是Container之后, 會(huì)在對(duì)應(yīng)的Container(Container信息里面會(huì)包含NM節(jié)點(diǎn)信息)啟動(dòng)Executor
(5)AM的SC會(huì)分配任務(wù)及給Executor進(jìn)行執(zhí)行(之前Executor會(huì)去向AM中的SC注冊(cè)), 同時(shí)EXecutor會(huì)向AM匯報(bào)運(yùn)行的狀態(tài)和進(jìn)度,也就是上面綠色的通信
(6)AM向RM注冊(cè)之后, AM會(huì)定時(shí)向RM匯報(bào)程序的運(yùn)行狀態(tài)等信息,也就是上面紅色部分的通信。

1.2 Yarn-client

Yarn-Client

其具體流程和上面的yarn-cluster很類似
(1) Client端啟動(dòng)應(yīng)用程序,提交APP到Y(jié)ARN RM, 這個(gè)過(guò)程則涉及到SC的初始化,SC啟動(dòng)時(shí)會(huì)去初始化DAGScheduler調(diào)度器, 使用反射方法去初始化YarnScheduler 和 YarnClientSchedulerBackend,最終Client會(huì)去向RM申請(qǐng)啟動(dòng)AM
(2)RM收到請(qǐng)求之后, 就會(huì)在集群中隨機(jī)選擇一個(gè)NM, 為該應(yīng)用程序分配第一個(gè)Container, 然后在這個(gè)Contaiiner上啟動(dòng)AM,AM則實(shí)現(xiàn)了SC等的初始化, 此處與yarn-cluster不同的是,SC的初始化驅(qū)動(dòng)程序的啟動(dòng)并不在AM中, 也就是AM并不是Driver端,但是AM會(huì)和SC通信來(lái)獲取其需要的資源情況(多少cpu, 多少memory)
(3)當(dāng)客戶端的SC與AM啟動(dòng)完畢,會(huì)通信, AM可知道SC需要的資源情況, 然后AM會(huì)向RM注冊(cè), 并向RM申請(qǐng)資源Container
(4)AM申請(qǐng)到資源Container之后, 會(huì)與COntainer對(duì)應(yīng)的NodeManager通信, 要求他在其Container里面啟動(dòng)Executor, 然后去向客戶端的SparkContext注冊(cè), 并申請(qǐng)任務(wù)集Tasks
(5)客戶端的SC分配任務(wù)集給Executor,
(6)應(yīng)用程序運(yùn)行結(jié)束之后,客戶端的SC會(huì)向RM申請(qǐng)資源釋放并去關(guān)閉自己,kill進(jìn)程等

上面的流程介紹完之后, 來(lái)對(duì)比一下YARN-CLUSTER 與 yarn-client的區(qū)別:
其主要區(qū)別的是AM的作用不大一樣,
yarn-client模式下:AM僅僅向RM請(qǐng)求資源, 然后AM會(huì)在對(duì)應(yīng)的Container中要求其所屬NodeManager去啟動(dòng)Executor, Client會(huì)去與此Container Executor通信, 也就是整個(gè)程序運(yùn)行過(guò)程中, Client不能離開
yarn-cluster模式: Driver運(yùn)行在AM中,也就是SC與Executor的所有通信操作都與Client無(wú)關(guān)了, 在提交完應(yīng)用程序之后,Client就可以離開了。

2 spark-submit提交到y(tǒng)arn

首先安裝好Hadoop 并配置好Yarn, 之后啟動(dòng)sbin/start-yarn.sh

其次針對(duì)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

下面說(shuō)明一個(gè)最基本的應(yīng)用程序

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())
  }
}

通過(guò)maven編譯成jar包, 然后通過(guò)spark-shell去提交此jar包到y(tǒng)arn上

./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

提交之后顯示:

image.png
image.png

根據(jù)Yarn上的application id找到對(duì)應(yīng)日志:

image.png

3 IDEA代碼提交到y(tǒng)arn

通過(guò)IDEA實(shí)現(xiàn)代碼提交其實(shí)很簡(jiǎn)單, 主要是設(shè)置Master, Yarn模式不像mesos以及standalone模式通過(guò)傳輸url來(lái)實(shí)現(xiàn)資源管理, yarn模式實(shí)際上是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())
  }
}

運(yùn)行spark之后, 去8088yarn頁(yè)面去查看一下:

image.png

注意IDEA代碼提交到y(tǒng)arn只能使用yarn-client模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,528評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容