YARN
Yarn 是一個操作系統級別的統一的資源管理和調度框架
多種計算框架可以通過Yarn共享集羣資源,按需分配 ==> 可以提升資源的利用率
Yarn上可以跑:
批處理作業(MR)
交互式INTERACTIVE(Tez)
ONLINE (HBASE)
Streaming (Storm/Flink)
In-Memory (Spark)
Spark on YARN執行流程
- Client端將任務提交到YARN的RM中的ApplicationsManager,這其中包含Driver程序和啓動命令;
- ApplicationsManager會找一個NodeManager來分配第一個Container容器,用來啓動ApplicationMaster程序,ApplicationMaster啓動Driver。啓動之後Application會向ApplicationsManager註冊,彙報已經創建成功,這時可以從WebUI來觀測整個App的運行情況;
- ApplicationMaster會向ResourceManager的ResourceScheduler以輪詢的方式申請資源(所謂輪詢是指:如果集羣資源不夠,會先拿部分資源來運行,運行完之後釋放container再執行),申請到資源並拿到資源列表,ApplicationMaster會到對應的NodeManager上去要求分配Container,繼而啓動Executor分配各種Task。
- AppMaster會一直監測各個Executor的執行情況,如果掛掉會進行重跑;
- 當所有的Executor執行完任務,AppMaster會向ApplicationsManager註銷並關閉自己。
MR 與 Spark作業對比
- MR: base-process
each task in its process: MapTask,ReduceTask process
when a task completes,the process goes away - Spark: base-thread
many tasks can run concurrently in a single process (executor)
一個Executor進程可以跑多個Task(這幾個Task是並行計算的)
this process sticks around for the lifetime of the Spark Application
lifetime of the Spark Application:
整個Spark Application包括一個driver和多個Executor
一個程序起來以後,即使是沒有job運行,Executor還是存在的
基於線程比基於進程的好處:
3. MapReduce啓動,因爲都是進程,啓動時資源都需要申請,結束後需要銷燬
4. Spark在申請到Executor之後,所有的task可以直接啓動,不需要再去申請資源,這樣省去了很多時間。
Cluster Manage
Spark Application ==> CM (Local,Standalone,Yarn,Mesos,K8S==> Pluggable 可插拔的)
Application Master :AM
每一個YARN Application 都會有AM (first container)
Executor runs in container ===> (memory of container > Executor memory)
Spark在YARN模式下僅僅是一個客戶端
Spark on Yarn 中,Spark僅僅只是一個客戶端而已,不需要裝一個集羣:
提交Spark作業的這臺機器必須是有GATEWAY權限的機器,只要能訪問到Hadoop的配置文件就可以了。跑Yarn的時候,只需要這臺機器作爲客戶端就可以了,並不需要slaves那些東西,所以 Spark on Yarn 僅僅只需要一臺客戶端。不需要 spark 節點 ,不需要 start-master.sh,start-slaves.sh,不需要在那些節點上起任何的Spark的進程。生產上95%都跑在Yarn上的。
工作上,只要GATEWAY+spark-submit就可以了,不需要起別的任何的進程
Deploy Mode
Spark的部署模式分爲 Cluster 和 Client
-
Client
the Spark driver runs in the client process,AM is only used for requesting resources;
由於AM只是需要申請資源,driver跑在本地,所以需要client監測並調度各個節點的任務,所以Client不能停掉;
適用於交互、調試,希望立即看到 app 的輸出,Cluster模式看日誌比較麻煩,因爲不知道AM運行在那個節點上;
默認是client模式 -
Cluster
the Spark driver runs inside an ApplicationMaster process which is managed by YARN;
the Client can go away after initiating the application
適用於生產環境
ApplicationMaster:在client模式中只是申請資源的;在 cluster模式中既申請資源又調度task。
實例
export HADOOP_CONF_DIR=/home/hadoop/software/hadoop-xxxx/etc/hadoop
./spark-shell --master yarn
--deploy-mode DEPLOY_MODE 默認是client,所以這個啓動模式時client模式;
注意,這裏不能使用cluster模式,會報錯:
Error: Cluster deploy mode is not applicable to Spark shells.
因爲spark-shell作爲一個與用戶交互的命令行,必須將Driver運行在本地,而不是yarn上
--num-executors NUM 指定YARN模式下啓動多少個Executor 默認是2個Executor
在WebUI中,顯示 RunningContainer爲3,AllocatedCPU VCores爲3
RunningContainer爲3是因爲driver佔用一個Container加上默認的2個Executor各自佔用一個Container,所以是佔用3個Container;
而默認一個Container佔用一個虛擬Core,所以AllocatedCPU VCores爲3。