1. 程式人生 > >Spark學習筆記(四)—— Yarn模式

Spark學習筆記(四)—— Yarn模式

1、Yarn執行模式介紹

Yarn執行模式就是說Spark客戶端直接連線Yarn,不需要額外構建Spark叢集。如果Yarn是分散式部署的,那麼Spark就跟隨它形成了分散式部署的效果。有yarn-client和yarn-cluster兩種模式,主要區別在於:Driver程式的執行節點。

  • yarn-client:Driver程式執行在客戶端,適用於互動、除錯,希望立即看到app的輸出

  • yarn-cluster:Driver程式執行在由RM(ResourceManager)啟動的AP(APPMaster)適用於生產環境。

其實簡單說來,就是用Spark替換掉了Hadoop中的MapReduce;或者理解成,用Yarn替換掉了Spark的資源排程器。都是一回事,取長補短的結果。

2、安裝配置

1)修改hadoop配置檔案yarn-site.xml,新增如下內容:

<!--是否啟動一個執行緒檢查每個任務正使用的實體記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true -->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>
<!--是否啟動一個執行緒檢查每個任務正使用的虛擬記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true -->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

2)修改spark-env.sh,新增如下配置,指定Yarn的配置 :

[simon@hadoop102 conf]$ vi spark-env.sh

YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop

3)分發配置檔案

[simon@hadoop102 conf]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
#spark-env.sh可分發可不分發,因為Yarn是叢集模式,Spark執行在Yarn上
[simon@hadoop102 conf]$ xsync spark-env.sh

4)啟動Hadoop叢集:

[simon@hadoop102 hadoop-2.7.2]$ start-dfs.sh
#在ResourceManager上啟動Yarn
[simon@hadoop103 module]$ start-yarn.sh

5)執行一個應用程式:

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

我們比較一下,它和local模式有什麼不一樣的地方:

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

引數說明:

  • --master 指定Master的地址,預設為Local
  • --class: 你的應用的啟動類 (如 org.apache.spark.examples.SparkPi)
  • --deploy-mode: 是否釋出你的驅動到worker節點(cluster) 或者作為一個本地客戶端 (client) (default: client)*
  • --conf: 任意的Spark配置屬性, 格式key=value. 如果值包含空格,可以加引號“key=value”
  • application-jar: 打包好的應用jar,包含依賴. 這個URL在叢集中全域性可見。 比如hdfs:// 共享儲存系統, 如果是 file:// path, 那麼所有的節點的path都包含同樣的jar
  • application-arguments: 傳給main()方法的引數
  • --executor-memory 1G 指定每個executor可用記憶體為1G
  • --total-executor-cores 2 指定每個executor使用的cup核數為2個

不同的地方很明顯:指定了master為Yarn模式,--deploy-mode,為client模式,預設的代表是Local模式。

3、Yarn模式執行流程

畫了一張圖,感受一下:

其實我感覺圖畫的已經挺清楚的了,再嘗試用文字解釋一下吧,以後看原始碼會對圖的理解更加深刻:

1)客戶端提交應用給Yarn的ResourceManager(RM);

2)RM選擇一個NodeManager(NM)建立ApplicationMaster(AM);

3)AM向RM索要執行任務的資源;

4)RM返回給AM可用的資源列表(例如:NM1、NM2、NM3);

5)AM選擇一個NM,建立Spark的執行器物件Executor

6)那麼AM怎麼知道這個Executor建立了以及它的狀態呢,這時候Executor反向註冊到AM;

7)AM知道了Executor的狀態,開始分解任務,交給它執行。

先有一個大致的印象,方便之後看原始碼去理解,這樣整個程式碼的邏輯才更加清晰,反過來對整個流程也能理解的更加深刻。

4、日誌檢視

有時候我們需要對任務進行實時的監控,或者返回來看任務的執行流程,那麼就需要檢視日誌了。由於我們現在使用的Yarn模式,那麼就自然而然的想到,日誌資訊應該是在Yarn的web UI中檢視。也就是:使得Yarn能夠看到Spark的執行日誌。

1)修改配置檔案spark-defaults.conf

新增如下內容:

spark.yarn.historyServer.address=hadoop102:18080
spark.history.ui.port=18080

2)重啟spark歷史服務

[simon@hadoop102 spark]$ sbin/stop-history-server.sh 
#輸出
stopping org.apache.spark.deploy.history.HistoryServer

[simon@hadoop102 spark]$ sbin/start-history-server.sh 
#輸出
starting org.apache.spark.deploy.history.HistoryServer, logging to /opt/module/spark/logs/spark-simon-org.apache.spark.deploy.history.HistoryServer-1-hadoop102.out

3)提交任務到Yarn執行

[simon@hadoop102 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

4)Web頁面檢視日誌