分布式計算框架


MapReduce

簡介

概念

  • 面向批處理的分布式計算框架
  • 一種編程模型: MapReduce程序被分為Map(映射)和Reduce(化簡)階段

核心思想

  • 分而治之, 並行計算
  • 移動計算而非移動數據

特點

MapReduce有幾個特點:

  • 移動計算而不移動數據:分布式計算,計算跟着數據走,數據存放在哪就在哪里進行計算,極大的減少了IO的開銷。

  • 良好的擴展性:分布式計算框架擁有相當良好的擴展性,隨着節點數量的增加,單個節點的計算量減小,整體的計算能力近乎線性的遞增。

  • 高容錯性:計算任務失敗,會自動恢復計算,擁有良好的容錯性。

  • 狀態監控:提交任務之后,任務具體執行在哪個節點,具體執行到哪個階段,在后台或者監控界面,我們都能實時的進行監控。

  • 適合於海量數據的離線批處理:MapReduce在設計之初的目標就是面向離線批處理,特別是大吞吐量的離線處理場景,更適合於MapReduce。

  • 降低了分布式編程的門檻:大部分操作MapReduce已經實現,我們僅僅需要在特定的部分編寫我們自己的業務邏輯,極大的減少了工作量,同時也降低了編程的門檻。

MR原理

1. 作業(job):作業是客戶端提交請求執行的一個單元,它包括數據、計算框架以及一些配置信息等。

2. 任務(task):是作業細分之后的細分工作單元,如MapReduce中的Map Task和Reduce Task。

  • MapReduce划分為四個階段,分別為:Split、Map、Shuffle、Reduce。

1. Split階段,主要負責“分”,這個階段會由MapReduce自動將一個大文件切分成多個小的split文件片段,split只是邏輯概念,僅包含如數據起始位置,長度,所在位置等描述信息。2.x當中默認的切分規則,一個split剛好為一個block大小128M。那么10TB的數據文件,此時就會划分為像圖中一樣多個小split片段,每一個split交由一個Map Task處理。

2. Map階段,會處理經過Split階段切分好的數據片段,每一個split將對應一個Map的任務,也就說像圖中所畫Split切分為三個片段,分別對應着三個Map Task任務。Map階段需要開發人員自己按照業務做實現,並且當我們分析的數據是HDFS當中文本數據時,他會一行一行來進行讀取,最終需要按照Key-Value形式輸出。那在WordCount案例中,讀到每行數據時我們按照文本的分隔符將文本切分為一個一個單詞,最后以單詞作為key、1作為value進行輸出。這樣輸出之后,最終對於每一個單詞我們只要將1做累加就可以得到結果。

3. Shuffle階段,他會完成分區、排序、分組等操作,分區決定了Map任務交由哪個Reduce任務處理,Reduce任務決定了有多少個分區。先分析WordCount,默認Shuffle階段會將Map階段輸出的Key-Value鍵值對按照單詞的順序做排序、分組,最終將相同的單詞划分到一組,交給下個階段Reduce來處理。

4. Reduce階段,和Map一樣都需要開發人員自己實現,它所處理的數據是Map輸出之后經過Shuffle排好序、分好組的數據,那么在WordCount當中,Reduce任務每次處理的都是單詞相同的一組數據,這段代碼實現就很簡單我只要對於這一組數據當中的Value進行累加,即可得到一個單詞的數量,當Reduce所有任務執行完成即把每組單詞數據處理完成之后,即可拿到最終的結果。



圖中展示了Mapreduce的執行流程。首先數據要被Split切分,但是因為存儲在HDFS上,所以數據已經被切分成了Block塊,那接下來就會在每個Block塊上分發一個Map作業進行中間結果的計算,計算結果保存為key-value的形式。此時shuffle階段負責將Key值相同的數據分發到同一個Reduce節點上進行計算。Shuffle對Key值進行Hash取模,然后按照Reduce的個數形成對應的文件。Reduce節點會去Map節點去取自己的文件,取到之后進行合並。合並成大文件之后,在Reduce節點進行結果的匯總,最終結果保存到HDFS中。

  • Shuffle詳解

Shuffle連接了Map以及Reduce,它在Map以及Reduce兩台服務器上都有執行。

作業運行管理

TaskTracker 和DataNode放在同一個節點: 移動計算

Spark

簡介



原理

編程模型

RDD(Resilient Distributed Datesets、彈性分布式數據集)是Spark特有的數據模型,Spark當中的計算都是通過操作RDD來完成的。DAG(有向無環圖),RDD各項操作之間的相互依賴會被轉成DAG,DAG划分不同的stage階段,由不同的task任務運行。

RDD同時也是Spark的基本計算單元,是對分布式內存的抽象使用,實現了以操作本地集合的方式來操作分布式數據集的抽象實現。RDD是Spark最核心的東西,它表示已被分區,不可變的並能夠被並行操作的數據集合,不同的數據集格式對應不同的RDD實現。RDD必須是可序列化的。RDD可以cache到內存中,每次對RDD數據集的操作之后的結果,都可以存放到內存中,下一個操作可以直接從內存中輸入,省去了MapReduce大量的磁盤IO操作。對應用透明,開發人員只需要對於RDD進行操作即可不需要其他的處理。RDD的創建操作只能是基於穩定的數據集或者已有的RDD,整個Job任務在計算過程中如果出現錯誤,可以通過這一系列的轉換、算子追述到之前的操作,自動重構從而保證計算的正確性。



在程序運行的時候,首先會運行Driver,Driver相當於是整個任務的管理程序,負責對任務進行解析、分發、監控等。Driver中包含的SparkContext是Spark的運行環境。

Driver運行起來之后,會向ClusterManager主節點去申請資源,申請到的資源是在WorkerNode上封裝好的Executor容器,容器包含了程序運行的CPU、內存等資源。

然后Driver會將Task分發到這些Executor中進行執行,執行過程中,會時刻監控這些Task的運行情況,並做實時的管理和調度。



Yarn模式是比較常見的一種模式,Spark將任務提交到yarn上去運行。這種模式根據Driver的位置不同,又細分為Client和Cluster兩種模式。

Executor拿到我們分發的這些個任務,開始任務的真正執行。

邏輯查詢計划的生成基本上就是我們所寫的計算邏輯,根據RDD之間的流程關系等,生成對應的邏輯查詢計划。

物理查詢計划的生成,依賴於我們的邏輯查詢計划。首先根據我們RDD的種類以及對應的寬窄依賴關系,生成多個Stage,每個Stage之間也會有對應的邏輯關系,如圖所示。最后由我們的多個Stage,組成了我們最后的DAG。

當拿到了多個Stage,提交給Driver來執行的時候,基本就是這個樣子。以圖為例,首先Stage1中全部是一些Transformation操作,而Stage1到Stage2之間出現了寬依賴關系,也就是出現了Action操作。這些個動作轉換,就是要提交給Executor來執行的Task任務,所有Task任務的分配以及監控,都是由SparkContext來完成的。

DAG任務規划與調度

RDD操作中的一系列依賴關系,Spark后期會轉換為DAG來進行表示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM