本系列講座是馮沁原先生對(duì)Sameer Farooqui的《Advanced Apache Spark》的解說(shuō)。
根據(jù)對(duì)215名學(xué)生的調(diào)查結(jié)果顯示,Spark最主要資源管理方式按排名為Hadoop Yarn, Apache Standalone 和Mesos。在單機(jī)使用時(shí),Spark還可以采用最基本的local模式。

圖1.如何部署Spark的統(tǒng)計(jì)圖
本節(jié)主要介紹Local和Spark Standalone資源管理模式。下一節(jié)將介紹YARN。
1. 傳統(tǒng)Hadoop MapReduce的資源管理方式

圖2.有兩個(gè)Map Reduce App運(yùn)行的Hadoop的資源管理
Name Node管理所有節(jié)點(diǎn)的情況,每臺(tái)機(jī)器里有Data node, 存儲(chǔ)數(shù)據(jù)。
Job Tracker將任務(wù)發(fā)到Task Tracker。 每個(gè)Task Tracker啟動(dòng)Map和Reduce工作。
2. Spark最基本的Local模式。

圖3. 本地(Local)運(yùn)行Spark。
帶有8個(gè)內(nèi)核的CPU啟動(dòng)了一個(gè)JVM, 右下黑色的是Driver, 啟動(dòng)12個(gè)task的本地運(yùn)行環(huán)境, 通過(guò)內(nèi)部的線程進(jìn)行并發(fā)運(yùn)算。
圖3的JVM中存了兩個(gè)邏輯RDD, 紫色的RDD有三個(gè)分區(qū)。藍(lán)色的RDD有兩個(gè)分區(qū)。
右側(cè)程序演示了在scala中用SparkConf設(shè)置了如左側(cè)的運(yùn)行環(huán)境, 注意到這段程序還為Executor分配了3GB的內(nèi)存。
3. Spark Standalone模式
Spark Standalone Mode用于多臺(tái)機(jī)器的集群(cluster)管理。一臺(tái)Master負(fù)責(zé)管理集群。
每個(gè)機(jī)器里有一個(gè)worker與Spark Master交互。
RDD現(xiàn)在被分塊到了多臺(tái)機(jī)器中。如圖藍(lán)色RDD有八個(gè)分塊, 每臺(tái)分到兩個(gè)。紫色的RDD分成了兩個(gè)分塊,并且復(fù)制到了另兩臺(tái)機(jī)器。
每臺(tái)機(jī)器的內(nèi)核數(shù)量不同,可以并發(fā)的任務(wù)數(shù)也不同,左起第二臺(tái)機(jī)器的內(nèi)核數(shù)量多,可以分配更多的并發(fā)任務(wù)。注意到圖中用SSD作為為中間存儲(chǔ)設(shè)備。SSD比硬盤快很多,可以提高性能。

圖4. 單個(gè)Master的Standalone調(diào)度
多個(gè)master時(shí),可以用zookeeper調(diào)度,如圖5。

圖5.多個(gè)Master時(shí)的Standalone模式
一個(gè)worker可以調(diào)用多個(gè)executor, 如圖6。

圖6. 一個(gè)Worker調(diào)度多個(gè)Executor
默認(rèn)一個(gè)Worker為一個(gè)Driver調(diào)度一個(gè)Executor,如果我們希望一個(gè)Driver用兩個(gè)Executor,則要為該Driver創(chuàng)建兩個(gè)Worker。如圖7。

圖7一個(gè)Driver調(diào)用兩個(gè)Executor.
4. Spark為我們提供了任務(wù)執(zhí)行統(tǒng)計(jì)信息的網(wǎng)頁(yè)。通過(guò)這些頁(yè)面我們可以看到當(dāng)前的任務(wù)數(shù)量,Worker以及Executor信息,正運(yùn)行的Job, Stages和Tasks, 內(nèi)存的使用情況等等信息。

圖8. Spark任務(wù)執(zhí)行統(tǒng)計(jì)UI
5. 總結(jié)Spark standalone工作模式
Spark用Master來(lái)管理整個(gè)Cluster, worker來(lái)與Master進(jìn)行交互管理當(dāng)?shù)氐膱?zhí)行情況。Worker 有Executor,里面有多個(gè)Job執(zhí)行。
每個(gè)工作(Job)分多個(gè)階段(Stage), 每個(gè)階段 (Stage)分為多個(gè)任務(wù)(Task)。
RDD的分塊執(zhí)行。使用統(tǒng)計(jì)面板里的具體信息理解任務(wù)調(diào)度。