什么是RDD
RDD作為數(shù)據(jù)結(jié)構(gòu),本質(zhì)上是一個只讀的分區(qū)記錄集合。一個RDD可以包含多個分區(qū),每個分區(qū)就是一個dataset片段。RDD可以相互依賴。如果RDD的每個分區(qū)最多只能被一個Child RDD的一個分區(qū)使用,則稱之為narrow dependency;若多個Child RDD分區(qū)都可以依賴,則稱之為wide dependency。不同的操作依據(jù)其特性,可能會產(chǎn)生不同的依賴。例如map操作會產(chǎn)生narrow dependency,而join操作則產(chǎn)生wide dependency。
1.Spark生態(tài)圈
如下圖所示為Spark的整個生態(tài)圈,最底層為資源管理器,采用Mesos、Yarn等資源管理集群或者Spark自帶的Standalone模式,底層存儲為文件系統(tǒng)或者其他格式的存儲系統(tǒng)如HBase。Spark作為計算框架,為上層多種應(yīng)用提供服務(wù)。Graphx和MLBase提供數(shù)據(jù)挖掘服務(wù),如圖計算和挖掘迭代計算等。Shark提供SQL查詢服務(wù),兼容Hive語法,性能比Hive快3-50倍,BlinkDB是一個通過權(quán)衡數(shù)據(jù)精確度來提升查詢晌應(yīng)時間的交互SQL查詢引擎,二者都可作為交互式查詢使用。Spark Streaming將流式計算分解成一系列短小的批處理計算,并且提供高可靠和吞吐量服務(wù)。

2.Spark基本原理
Spark運行框架如下圖所示,首先有集群資源管理服務(wù)(Cluster Manager)和運行作業(yè)任務(wù)的結(jié)點(Worker Node),然后就是每個應(yīng)用的任務(wù)控制結(jié)點Driver和每個機器節(jié)點上有具體任務(wù)的執(zhí)行進(jìn)程(Executor)。

與MR計算框架相比,Executor有二個優(yōu)點:
一個是多線程來執(zhí)行具體的任務(wù),而不是像MR那樣采用進(jìn)程模型,減少了任務(wù)的啟動開稍。
二個是Executor上會有一個BlockManager存儲模塊,類似于KV系統(tǒng)(內(nèi)存和磁盤共同作為存儲設(shè)備),當(dāng)需要迭代多輪時,可以將中間過程的數(shù)據(jù)先放到這個存儲系統(tǒng)上,下次需要時直接讀該存儲上數(shù)據(jù),而不需要讀寫到hdfs等相關(guān)的文件系統(tǒng)里,或者在交互式查詢場景下,事先將表Cache到該存儲系統(tǒng)上,提高讀寫IO性能。
另外Spark在做Shuffle時,在Groupby,Join等場景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二種模式,Spark還提供了更加豐富全面的運算操作如filter,groupby,join等。

Spark采用了Scala來編寫,在函數(shù)表達(dá)上Scala有天然的優(yōu)勢,因此在表達(dá)復(fù)雜的機器學(xué)習(xí)算法能力比其他語言更強且簡單易懂。提供各種操作函數(shù)來建立起RDD的DAG計算模型。把每一個操作都看成構(gòu)建一個RDD來對待,而RDD則表示的是分布在多臺機器上的數(shù)據(jù)集合,并且可以帶上各種操作函數(shù)。如下圖所示:
首先從hdfs文件里讀取文本內(nèi)容構(gòu)建成一個RDD,然后使用filter()操作來對上次的RDD進(jìn)行過濾,再使用map()操作取得記錄的第一個字段,最后將其cache在內(nèi)存上,后面就可以對之前cache過的數(shù)據(jù)做其他的操作。整個過程都將形成一個DAG計算圖,每個操作步驟都有容錯機制,同時還可以將需要多次使用的數(shù)據(jù)cache起來,供后續(xù)迭代使用。
3.spark 在yarn集群上運行

1. 由client向ResourceManager提交請求,并上傳jar到HDFS上這期間包括四個步驟:
a). 連接到RM
b). 從RM ASM(ApplicationsManager )中獲得metric、queue和resource等信息。
c). upload app jar and spark-assembly jard). 設(shè)置運行環(huán)境和container上下文(launch-container.sh等腳本)
**2. **ResouceManager向NodeManager申請資源,創(chuàng)建Spark ApplicationMaster(每個SparkContext都有一個ApplicationMaster)
**3. **NodeManager啟動Spark App Master,并向ResourceManager AsM注冊
4. Spark ApplicationMaster從HDFS中找到j(luò)ar文件,啟動DAGscheduler和YARN Cluster Scheduler
5. ResourceManager向ResourceManager AsM注冊申請container資源(INFO YarnClientImpl: Submitted application)
**6. **ResourceManager通知NodeManager分配Container,這時可以收到來自ASM關(guān)于container的報告。(每個container的對應(yīng)一個executor)
**7. **Spark ApplicationMaster直接和container(executor)進(jìn)行交互,完成這個分布式任務(wù)。
需要注意的是:
a). Spark中的localdir會被yarn.nodemanager.local-dirs替換
b). 允許失敗的節(jié)點數(shù)(spark.yarn.max.worker.failures)為executor數(shù)量的兩倍數(shù)量,最小為3.
c). SPARK_YARN_USER_ENV傳遞給spark進(jìn)程的環(huán)境變量d). 傳遞給app的參數(shù)應(yīng)該通過–args指定。