最近從Hadoop 1.x 轉到Hadoop 2.x 同時將一些java 程序轉爲Scala的程序將平臺上的代碼減小了不少,在實施的過程當中,開到一些Spark相關的YARN的部署上都是基於以前的Hadoop 1.x的部分方式,在Hadoop2.2 +版本之上 基本上就不用這麼部署了。其緣由就是Hadoop YARN 統一資源管理。java
Spark應用在集羣上以獨立的進程集合運行,在你的主程序(稱爲驅動程序)中以SparkContext對象來調節。 特別的,爲了在集羣上運行,
SparkContext能夠與幾個類型的集羣管理器(Spark自身單獨的集羣管理器或者Mesos/YARN)相鏈接,這些集羣管理器能夠在應用間分配資源。一旦鏈接,Spark須要在集羣上的線程池子節點,也就是那些執行計算和存儲應用數據的工做進程。而後,它將把你的應用代碼(以JAR或者Python定義的文件並傳送到SparkContext)發送到線程池。最後,SparkContext發送任務讓線程池運行。(因此是經過SparkContext發送到其餘節點的,在此你只是須要獲得SparkContext,就行啦)。
關於這個架構有幾個游泳的地方須要注意:
1.各個應用有本身的線程池進程,會在整個應用的運行過程當中保持並在多個線程中運行任務。這樣作的好處是把應用相互孤立,即在調度方面(各個驅動調度它本身的任務)也在執行方面(不一樣應用的任務在不一樣的JVM上運行)。然而,這也意味着若不把數據寫到額外的存儲系統的話,數據就沒法在不一樣的Spark應用間(SparkContext的實例)共享。
2.對於潛在的集羣管理器來講,Spark是不可知的。只要它須要線程池的進程和他們間的通訊,那麼即便是在也支持其餘應用的集羣管理器(例如,Mesos/YARN)上運行也相對簡單。
3. 由於驅動在集羣上調度任務,它應該運行接近到工做節點,在相同的局域網內更好。若是你想對遠程的集羣發送請求,較好的選擇是爲驅動打開一個RPC,讓它就近提交操做而不是運行離工做節點很遠的驅動。
集羣管理類型
系統目前支持3中集羣管理:
(1)單例模式 一種簡單的集羣管理,其包括一個很容易搭建集羣的Spark
(2) Apache Mesos模式 一種通用的集羣管理,能夠運行Hadoop MapReduce和服務應用的模式
(3) Hadoop YARN模式 Hadoop 2.0 中的資源管理模式
其實,在Amazon EC2(亞馬遜彈性計算雲)中Spark的EC2啓動腳本能夠很容易的啓動單例模式。
給集羣發佈代碼
給集羣發佈代碼的一種推薦的方式是經過SparkContext的構造器,這個構造器能夠給工做節點生成JAR文件列表(Java/Scala)或者.egg文件和.zip包文件(Python)。你也能夠執行SparkContext.addJar和addFile來動態的建立發送文件。
監控器
每一個驅動程序有一個Web UI,典型的是在4040端口,你能夠看到有關運行的任務,程序和存儲空間大小等信息。你能夠在瀏覽器中輸入簡單的URL方式來訪問:http://<驅動節點>::4040.監控器也能夠指導描述其它監控信息。(若是你使用的Spark YARN 模式的,只有運行Spark才能看到UI頁面,你中止了,log數據就沒了,但你能夠將log持久化)。
任務調度
Spark能夠經過在應用外(集羣管理水平)和應用裏(若是在同一個SparkContext中有多個計算指令)資源分配。