spark技術(shù)背景
大多數(shù)現(xiàn)有的集群計算系統(tǒng)都是基于非循環(huán)的數(shù)據(jù)流模型锌云。即從穩(wěn)定的物理存儲(如分布式文件系統(tǒng))中加載記錄,記錄被傳入由一組確定性操作構(gòu)成的DAG(有向無環(huán)圖)逐样,然后寫回穩(wěn)定存儲相速。DAG數(shù)據(jù)流圖能夠在運行時自動實現(xiàn)任務(wù)調(diào)度和故障恢復(fù)。
盡管非循環(huán)數(shù)據(jù)流是種很強大的抽象方法透典,但仍然有些應(yīng)用無法使用這種方式描述滤奈。包括1.機器學(xué)習(xí)和圖應(yīng)用中常用的迭代算法 2.交互式數(shù)據(jù)挖掘工具(用戶反復(fù)查詢一個數(shù)據(jù)子集)摆昧,基于數(shù)據(jù)流的框架并不明確支持工作集,所以需要將數(shù)據(jù)輸出到磁盤蜒程,然后每次查詢時重新加載绅你,會帶來極大開銷。針對上述問題昭躺。Spark實現(xiàn)了一種分布式內(nèi)存抽象忌锯,稱為彈性分布式數(shù)據(jù)集(RDD)。它支持基于工作集的應(yīng)用领炫,同時具有數(shù)據(jù)流模型的特點:自動容錯偶垮、位置感知性調(diào)度和可伸縮行。RDD允許用戶在執(zhí)行多個查詢時驹吮,顯示地將工作集緩存在內(nèi)存中针史,后續(xù)查詢能夠重用工作集,極大地提升了查詢速度碟狞。
RDD提供了一種高度受限內(nèi)存模型,即RDD是只讀記錄分區(qū)的集合婚陪,只能通過其他RDD執(zhí)行確定的轉(zhuǎn)換操作(如map族沃、join)而創(chuàng)建,這些限制使得實現(xiàn)容錯的開銷很低泌参。與分布式共享內(nèi)存系統(tǒng)需要付出高昂代價的檢查點和回滾機制不同脆淹,RDD通過Lineage來重建丟失的分區(qū):一個RDD中包含了如何從其他RDD衍生所必須的相關(guān)信息,而不需要檢查點操作就可以重建丟失的數(shù)據(jù)分區(qū)沽一。盡管RDD不是一個通用的共享內(nèi)存抽象盖溺,但他具備了良好的描述能力、可伸縮性和可靠性铣缠,能夠廣泛適用于數(shù)據(jù)并行類應(yīng)用烘嘱。
Hadoop 的MapReduce是基于數(shù)據(jù)集的
基于數(shù)據(jù)集的處理:從物理存儲上加載數(shù)據(jù)昆禽,然后操作數(shù)據(jù),然后寫入物理存儲設(shè)備蝇庭;
基于數(shù)據(jù)集的操作不適應(yīng)的場景:
1醉鳖,不適合于大量的迭代
2,交互式查詢
重點是:基于數(shù)據(jù)流的方式 不能夠復(fù)用曾經(jīng)的結(jié)果或者中間計算結(jié)果;
Spark RDD是基于工作集的
工作流和工作集的共同特點:位置感知哮内,自動容錯盗棵,負載均衡等。
Spark的位置感知比Hadoop的好很多北发,具體如下:
- Hadoop位置感知:Hadoop進行partition之后就不管Reducer在哪里了纹因。
- Spark的位置感知:Spark進行partition后再進行下一步Stage時會確定其位置,是更精致化的琳拨。
spark架構(gòu)綜述
Driver是用戶編寫的數(shù)據(jù)處理邏輯瞭恰,這個邏輯中包含用戶創(chuàng)建的SparkContext。SparkContext是用戶邏輯與Spark集群主要的交互接口从绘,它會和Cluster Manager交互寄疏,包括向他申請計算資源等。Cluster Manager負責(zé)集群的資源管理和調(diào)度僵井,現(xiàn)在支持Standalone陕截、Apache Mesos和Hadoop的YARN。Worker Node是集群中可以執(zhí)行計算任務(wù)的節(jié)點批什。Executor是在一個Worker Node上為某應(yīng)用啟動的一個進程农曲,該進程負責(zé)運行任務(wù),并且負責(zé)將數(shù)據(jù)存在內(nèi)存或者磁盤上驻债。Task是被送到某個Executor上的計算單元乳规。每個應(yīng)用都有各自獨立的Executor,計算最終在計算節(jié)點的Executor中執(zhí)行合呐。
用戶程序從最開始的提交到最終的計算執(zhí)行暮的,需要經(jīng)歷以下幾個階段:
- 用戶程序創(chuàng)建SparkContext時,新建的SparkContext實例會連接到Cluster Manager淌实。Cluster Manager會根據(jù)用戶提交時設(shè)置的CPU和內(nèi)存等信息為本地提交分配計算資源冻辩,啟動Executor。
- Driver會將用戶程序劃分為不同的執(zhí)行階段拆祈,每個執(zhí)行階段由一組完全相同的Task組成恨闪,這些Task分別作用于待處理數(shù)據(jù)的不同分區(qū)。在階段劃分完成和Task創(chuàng)建后放坏,Driver會向Executor發(fā)送Task咙咽。
- Executor在接收到Task后,會下載Task的運行依賴淤年,在準備好Task的執(zhí)行環(huán)境后钧敞,會開始執(zhí)行Task蜡豹,并且將Task的運行狀態(tài)回報給Driver。
- Driver會根據(jù)收到的Task的運行狀態(tài)來處理不同的狀態(tài)更新犁享。Task分為兩種:一種是Shuffle Map Task余素,它實現(xiàn)數(shù)據(jù)的重新洗牌,洗牌的結(jié)果保存到Executor所在節(jié)點的文件系統(tǒng)中炊昆;另一種是Result Task桨吊,它負責(zé)生成結(jié)果數(shù)據(jù)。
- Driver會不斷的調(diào)用Task凤巨,將Task發(fā)送到Executor執(zhí)行视乐,在所有的Task都正確執(zhí)行或者超過執(zhí)行次數(shù)的限制仍然沒成功時停止。
RDD實現(xiàn)詳解
Spark的目標是為了基于工作集的應(yīng)用(即多個并行操作重用中間結(jié)果的應(yīng)用)提供抽象敢茁,同時保持MapReduce及其相關(guān)模型的優(yōu)勢特性佑淀,即自動容錯、位置感知性協(xié)調(diào)和可伸縮性彰檬。RDD比數(shù)據(jù)流模型更易于編程伸刃,同時基于工作集的計算也具有良好的描述能力。
分布式數(shù)據(jù)集的容錯性有兩種方式:數(shù)據(jù)檢查點和記錄數(shù)據(jù)更新逢倍。我們面向大規(guī)模的數(shù)據(jù)分析捧颅,數(shù)據(jù)檢查點成本很高:需要數(shù)據(jù)中心網(wǎng)絡(luò)連接機器之間復(fù)制龐大的數(shù)據(jù)集,網(wǎng)絡(luò)帶寬往往比內(nèi)存帶寬低很多较雕,同時還要消耗更多的存儲資源(存儲到磁盤會降低應(yīng)用程序速度)碉哑。所以我們選擇記錄更新方式,但如果更新太多記錄更新的成本也很高亮蒋。因此RDD只支持粗顆粒度轉(zhuǎn)換扣典,即大量記錄上執(zhí)行的單個操作。將創(chuàng)建RDD的一系列轉(zhuǎn)換記錄下來(即Lineage)慎玖,以便恢復(fù)丟失的分區(qū)贮尖。
什么是RDD?RDD是只讀的趁怔、分區(qū)記錄的集合
远舅。RDD只能基于在穩(wěn)定物理存儲中的數(shù)據(jù)集和其他已有的RDD上執(zhí)行確定性操作來創(chuàng)建。這些確定性操作成為轉(zhuǎn)換痕钢,如map、filter序六、groupBy任连、join等。RDD不需要物化(落盤)例诀,RDD含有如何從其他RDD衍生(即計算)出本RDD的相關(guān)信息(Lineage)随抠,因此在RDD部分分區(qū)數(shù)據(jù)丟失的時候可以從物理存儲的數(shù)據(jù)計算出相應(yīng)的RDD分區(qū)裁着。
RDD的彈性表現(xiàn):
- 彈性之一:自動的進行內(nèi)存和磁盤數(shù)據(jù)存儲的切換;
- 彈性之二:基于Lineage的高效容錯(第n個節(jié)點出錯拱她,會從第n-1個節(jié)點恢復(fù)二驰,血統(tǒng)容錯);
- 彈性之三:Task如果失敗會自動進行特定次數(shù)的重試(默認4次)秉沼;
- 彈性之四:Stage如果失敗會自動進行特定次數(shù)的重試(可以只運行計算失敗的階段)桶雀;只計算失敗的數(shù)據(jù)分片;
- checkpoint和persist
- 數(shù)據(jù)調(diào)度彈性:DAG TASK 和資源 管理無關(guān)
- 數(shù)據(jù)分片的高度彈性(人工自由設(shè)置分片函數(shù)),repartition
每個RDD有5個主要屬性
- 一組分片(Partition)唬复,即數(shù)據(jù)集的基本組成單元矗积。對于RDD來說,每個分片都會被