spark on yarn 說明:(spark 使用 yarn 調度資源)
Apache Hadoop YARN (Yet Another Resource Negotiator,另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和調度.YARN 分層結構的本質是 ResourceManager。這個實體控制整個集群並管理應用程序向基礎計算資源的分配。ResourceManager 將各個資源部分(計算、內存、帶寬等)精心安排給基礎 NodeManager(YARN 的每節點代理) Hadoop2版本以上,引入YARN之后,不僅僅可以使用MapReduce,還可以引用spark等等計算

spark on yarn 的安裝配置
1.安裝hadoop:需要安裝HDFS模塊和YARN模塊,HDFS必須安裝,spark運行時要把jar包存放到HDFS上。
2.安裝Spark:解壓Spark安裝程序到一台服務器上,修改spark-env.sh配置文件,spark程序將作為YARN的客戶端用於提交任務
# 只需要配置以下兩點,可以配置到一個節點,也可以多個節點,只不過提交任務的機器多了
export JAVA_HOME=/usr/local/jdk1.7.0_80
export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.4/etc/hadoop
3.啟動HDFS和YARN
4,Spark 下載與 hadoop 版本對應的版本
5,Yarn 是 spark 的一個客戶端. 需要 spark 提交應用程序
6,Spark jar 包自動存放在 hdfs 之中,才能被 yarn 識別
spark on yarn 兩種接口模式:

1,client模式:Driver(也就是初始sc與 sqlcontext程序)運行在Client(提交jar包的節點,與resourcemanager無關)上,應用程序運行結果會在客戶端顯示,所有適合運行結果有輸出的應用程序(如spark-shell)
1),在client模式下,Driver運行在Client上,通過ApplicationMaster向RM獲取資源。
2),本地Driver負責與所有的executor container進行交互,並將最后的結果匯總。
3),結束掉終端,相當於kill掉這個spark應用。一般來說,如果運行的結果僅僅返回到terminal上時需要配置這個。
4),客戶端的Driver將應用提交給Yarn后,Yarn會先后啟動ApplicationMaster和executor,
5)另外ApplicationMaster和executor都 是裝載在container里運行,container默認的內存是1G,
6),ApplicationMaster分配的內存是driver- memory,executor分配的內存是executor-memory。
7),同時,因為Driver在客戶端,所以程序的運行結果可以在客戶端顯 示,Driver以進程名為SparkSubmit的形式存在。
yarn-client提交任務流程圖

cluster模式:
Driver程序在YARN中運行(由resourcemanager隨機分配driver,),應用的運行結果不能在客戶端顯示,所以最好運行那些將結果最終保存在外部存儲介質(如HDFS、Redis、Mysql)而非stdout輸出的應用程序,客戶端的終端顯示的僅是作為YARN的job的簡單運行狀況
Spark Driver首先作為一個ApplicationMaster在YARN集群中啟動,客戶端提交給ResourceManager的每一個job都會在集群的NodeManager節點上分配一個唯一的ApplicationMaster,由該ApplicationMaster管理全生命周期的應用。具體過程:
1. 由client向ResourceManager提交請求,並上傳jar到HDFS上
a).連接到RM
b).從RM的ASM(ApplicationsManager )中獲得metric、queue和resource等信息。
c). upload app jar and spark-assembly jar
d).設置運行環境和container上下文(launch-container.sh等腳本)
2. ResouceManager向NodeManager申請資源,創建Spark ApplicationMaster(每個SparkContext都有一個ApplicationMaster)
3. NodeManager啟動ApplicationMaster,並向ResourceManager AsM注冊
4. ApplicationMaster從HDFS中找到jar文件,啟動SparkContext、DAGscheduler和YARN Cluster Scheduler
5. ResourceManager向ResourceManager AsM注冊申請container資源
6. ResourceManager通知NodeManager分配Container,這時可以收到來自ASM關於container的報告。(每個container對應一個executor)
7. Spark ApplicationMaster直接和container(executor)進行交互,完成這個分布式任務

spark standlone 模式 driver一定在master之上, Executor在worker之上,在執行./spark-shell的時候,要加上MASTER這個參數
