spark學習筆記--叢集執行Spark

zxrui發表於2018-07-12

在叢集上執行Spark

Spark執行架構

在分散式環境下,Spark 叢集採用的是主 / 從結構。
Spark 應用通過一個叫作叢集管理器(Cluster Manager)的外部服務在叢集中的機器上啟動。Spark 自帶的叢集管理器被稱為獨立叢集管理器。Spark 也能執行在 Hadoop YARN 和 Apache Mesos 這兩大開源叢集管理器上。
在一個 Spark 叢集中,有一個節點負責中央協調,排程各個分散式工作節點。這個中央協調節點被稱為驅動器(Driver)節點,與之對應的工作節點被稱為執行器(executor)節點。驅動器節點可以和大量的執行器節點進行通訊,它們也都作為獨立的 Java 程式執行。驅動器節點和所有的執行器節點一起被稱為一個 Spark 應用(application)。

enter image description here

執行機制

  • 驅動器節點

    • 把使用者程式轉為任務

      Spark驅動器程式負責把使用者程式轉為多個物理執行的單元(稱為任務)
      所有程式都遵循同樣的結構:輸出資料建立一系列RDD-> 轉化操作派生出新的RDD -> 行動操作手機或儲存結果RDD中的資料
      有向無環圖:Spark隱式地建立一個有操作組成的邏輯上的無向無環圖,驅動程式執行可將其轉為物理執行計劃

    • 為執行器節點排程任務

      每個執行器節點代表一個能夠處理任務和儲存RDD資料的程式,執行器程式啟動後,會向驅動器程式註冊自己
      驅動程式會根據當前的節點集合,嘗試把所有任務基於資料所在位置分配給合適的執行器程式,同時執行器執行時,會跟蹤各快取資料的位置,進而排程以後的任務,儘量減少資料的網路傳輸
      Spark程式資訊:在本地模式下,訪問 http://localhost:4040 就可以看到這個網頁了

  • 執行器節點

    Spark執行器節點是一種工作程式,版鎖著整個Spark應用的生命週期,負責執行任務,任務間相互獨立,主要有兩大作用:

    • 執行器程式負責執行組成Spark應用的任務,並將結果返回給驅動器程式
    • 執行器程式通過自身的塊管理器為使用者程式中要求快取的RDD提供記憶體式儲存
  • 叢集管理器

    Spark 依賴於叢集管理器來啟動執行器節點,而在某些特殊情況下,也依賴叢集管理器來啟動驅動器節點。

啟動程式的過程概述

  • 使用者通過spark-submit指令碼提交應用
  • spark-submit指令碼啟動驅動器程式,呼叫使用者定義的main()方法
  • 驅動程式與叢集管理器通訊,申請資源以啟動執行器節點
  • 叢集管理器為驅動器程式啟動執行器節點
  • 驅動器程式執行使用者應用中的操作,根據程式中所定義的對RDD的轉化和行動操作,驅動器節點把工作以任務的形式傳送到執行器程式
  • 任務在執行器程式中進行計算並儲存結果
  • 如果驅動程式的main()方法退出,或者呼叫了SparkContext.stop(),驅動器程式會終止執行器程式,並且通過叢集管理器釋放資源

部署應用

spark_submit的一般格式

bin/spark-submit [options] <app jar | python file> [app options]

enter image description here

程式碼:

# 使用獨立叢集模式提交Java應用
$ ./bin/spark-submit \
--master spark://hostname:7077 \
--deploy-mode cluster \
--class com.databricks.examples.SparkExample \
--name "Example Program" \
--jars dep1.jar,dep2.jar,dep3.jar \
--total-executor-cores 300 \
--executor-memory 10g \
myApp.jar "options" "to your application" "go here"

# 使用YARN客戶端模式提交Python應用
$ export HADOP_CONF_DIR=/opt/hadoop/conf
$ ./bin/spark-submit \
--master yarn \
--py-files somelib-1.2.egg,otherlib-4.4.zip,other-file.py \
--deploy-mode client \
--name "Example Program" \
--queue exampleQueue \
--num-executors 40 \
--executor-memory 10g \
my_script.py "options" "to your application" "go here"

打包程式碼與依賴

通常使用者程式需要依賴第三方庫,Java 和 Scala 使用者也可以通過 spark-submit 的 --jars 標記提交獨立的 JAR 包依賴。
當你向 Spark 提交應用時,你必須把應用的整個依賴傳遞圖中的所有依賴都傳給叢集。你不僅要傳遞你直接依賴的庫,還要傳遞這些庫的依賴,以及它們的依賴的依賴,等等。
常規的做法是使用構建工具,生成單個大 JAR 包,包含應用的所有的傳遞依賴。這通常被稱為超級(uber)JAR 或者組合(assembly)JAR,大多數 Java 或 Scala 的構建工具都支援生成這樣的工件。

  • 使用Maven構建用Java編寫的Spark應用

    • Maven構建的Spark應用的pom.xml檔案 enter image description here
    • 打包使用Maven構建的Spark應用 enter image description here
  • 使用sbt構建的用Scala編寫的Spark應用

    • 使用 sbt 0.13 的 Spark 應用的 build.sbt 檔案 enter image description here

    • 在 sbt 工程構建中新增 assembly 外掛 enter image description here

    • 打包使用 sbt 構建的 Spark 應用 enter image description here

當使用者應用與 Spark 本身依賴同一個庫時可能會發生依賴衝突,導致程式崩潰

配置資源量

  • 執行器程式記憶體

    spark-submit 的 --executor-memory 引數來配置此項

  • 佔用核心總數的最大量

    spark-submit 的 --total-executorcores 引數設定這個值,或者在你的 Spark 配置檔案中設定 spark.cores.max 的值。

相關文章