Spark on Yarn 部分一原理及使用

weixin_33728268發表於2017-10-29

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
Yarn-cluster

下面來具體說說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
Yarn-Client

其具體流程和上面的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
image.png
2778947-02442c889863337d.png
image.png

根據Yarn上的application id找到對應日誌:

2778947-394360f65cdb29ff.png
image.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
image.png

注意IDEA程式碼提交到yarn只能使用yarn-client模式

相關文章