大資料開發:剖析Hadoop和Spark的Shuffle過程差異
一、前言
對於基於MapReduce程式設計正規化的分散式計算來說,本質上而言,就是在計算資料的交、並、差、聚合、排序等過程。而分散式計算分而治之的思想,讓每個節點只計算部分資料,也就是隻處理一個分片,那麼要想求得某個key對應的全量資料,那就必須把相同key的資料彙集到同一個Reduce任務節點來處理,那麼Mapreduce正規化定義了一個叫做Shuffle的過程來實現這個效果。
二、編寫本文的目的
本文旨在剖析Hadoop和Spark的Shuffle過程,並對比兩者Shuffle的差異。
三、Hadoop的Shuffle過程
Shuffle描述的是資料從Map端到Reduce端的過程,大資料學習kou群74零零加【41三八yi】大致分為排序(sort)、溢寫(spill)、合併(merge)、拉取複製(Copy)、合併排序(merge sort)這幾個過程,大體流程如下:
![image]()
上圖的Map的輸出的檔案被分片為紅綠藍三個分片,這個分片的就是根據Key為條件來分片的,分片演算法可以自己實現,例如Hash、Range等,最終Reduce任務只拉取對應顏色的資料來進行處理,就實現把相同的Key拉取到相同的Reduce節點處理的功能。下面分開來說Shuffle的的各個過程。
Map端做了下圖所示的操作:
1、Map端sort
Map端的輸出資料,先寫環形快取區kvbuffer,當環形緩衝區到達一個閥值(可以透過配置檔案設定,預設80),便要開始溢寫,但溢寫之前會有一個sort操作,這個sort操作先把Kvbuffer中的資料按照partition值和key兩個關鍵字來排序,移動的只是索引資料,排序結果是Kvmeta中資料按照partition為單位聚集在一起,同一partition內的按照key有序。
2、spill(溢寫) 當排序完成,便開始把資料刷到磁碟,刷磁碟的過程以分割槽為單位,一個分割槽寫完,寫下一個分割槽,分割槽內資料有序,最終實際上會多次溢寫,然後生成多個檔案 3、merge(合併) spill會生成多個小檔案,對於Reduce端拉取資料是相當低效的,那麼這時候就有了merge的過程,合併的過程也是同分片的合併成一個片段(segment),最終所有的segment組裝成一個最終檔案,那麼合併過程就完成了,如下圖所示
至此,Map的操作就已經完成,Reduce端操作即將登場 Reduce操作
總體過程如下圖的紅框處:
![image]()
1、拉取複製(fetch copy)
Reduce任務透過向各個Map任務拉取對應分片。這個過程都是以Http協議完成,每個Map節點都會啟動一個常駐的HTTP server服務,Reduce節點會請求這個Http Server拉取資料,這個過程完全透過網路傳輸,所以是一個非常重量級的操作。
2、合併排序
Reduce端,拉取到各個Map節點對應分片的資料之後,會進行再次排序,排序完成,結果丟給Reduce函式進行計算。
四、總結
至此整個shuffle過程完成,最後總結幾點:
1、shuffle過程就是為了對key進行全域性聚合2、排序操作伴隨著整個shuffle過程,所以Hadoop的shuffle是sort-based的
Spark shuffle相對來說更簡單,因為不要求全域性有序,所以沒有那麼多排序合併的操作。Spark shuffle分為write和read兩個過程。我們先來看shuffle write。
一、shuffle write
shuffle write的處理邏輯會放到該ShuffleMapStage的最後(因為spark以shuffle發生與否來劃分stage,也就是寬依賴),final RDD的每一條記錄都會寫到對應的分割槽快取區bucket,如下圖所示:
說明:
1、上圖有2個CPU,可以同時執行兩個ShuffleMapTask 2、每個task將寫一個buket緩衝區,緩衝區的數量和reduce任務的數量相等 3、 每個buket緩衝區會生成一個對應ShuffleBlockFile
4、ShuffleMapTask 如何決定資料被寫到哪個緩衝區呢?這個就是跟partition演算法有關係,這個分割槽演算法可以是hash的,也可以是range的
5、最終產生的ShuffleBlockFile會有多少呢?就是ShuffleMapTask 數量乘以reduce的數量,這個是非常巨大的
那麼有沒有辦法解決生成檔案過多的問題呢?有,開啟FileConsolidation即可,開啟FileConsolidation之後的shuffle過程如下:
在同一核CPU執行先後執行的ShuffleMapTask可以共用一個bucket緩衝區,然後寫到同一份ShuffleFile裡去,上圖所示的ShuffleFile實際上是用多個ShuffleBlock構成,那麼,那麼每個worker最終生成的檔案數量,變成了cpu核數乘以reduce任務的數量,大大縮減了檔案量。
二、Shuffle read
Shuffle write過程將資料分片寫到對應的分片檔案,這時候萬事具備,只差去拉取對應的資料過來計算了。
那麼Shuffle Read傳送的時機是什麼?是要等所有ShuffleMapTask執行完,再去fetch資料嗎?理論上,只要有一個 ShuffleMapTask執行完,就可以開始fetch資料了,實際上,spark必須等到父stage執行完,才能執行子stage,所以,必須等到所有 ShuffleMapTask執行完畢,才去fetch資料。fetch過來的資料,先存入一個Buffer緩衝區,所以這裡一次性fetch的FileSegment不能太大,當然如果fetch過來的資料大於每一個閥值,也是會spill到磁碟的。
fetch的過程過來一個buffer的資料,就可以開始聚合了,這裡就遇到一個問題,每次fetch部分資料,怎麼能實現全域性聚合呢?以word count的reduceByKey(《Spark RDD操作之ReduceByKey 》)為例,假設單詞hello有十個,但是一次fetch只拉取了2個,那麼怎麼全域性聚合呢?Spark的做法是用HashMap,聚合操作實際上是map.put(key,map.get(key)+1),將map中的聚合過的資料get出來相加,然後put回去,等到所有資料fetch完,也就完成了全域性聚合。
三、總結
Hadoop的MapReduce Shuffle和Spark Shuffle差別總結如下:
1、Hadoop的有一個Map完成,Reduce便可以去fetch資料了,不必等到所有Map任務完成,而Spark的必須等到父stage完成,也就是父stage的map操作全部完成才能去fetch資料。
2、Hadoop的Shuffle是sort-base的,那麼不管是Map的輸出,還是Reduce的輸出,都是partion內有序的,而spark不要求這一點。
3、Hadoop的Reduce要等到fetch完全部資料,才將資料傳入reduce函式進行聚合,而spark是一邊fetch一邊聚合。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3137/viewspace-2822693/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師大資料培訓分享Hadoop的shuffle過程程式設計師大資料Hadoop
- 大資料入門課程:Hadoop和spark的效能比較大資料HadoopSpark
- Spark-Shuffle過程概要參考Spark
- Spark和Hadoop之間的主要技術差異和選擇SparkHadoop
- Spark 原始碼系列(六)Shuffle 的過程解析Spark原始碼
- 大資料框架對比 - Hadoop、Spark、Storm、Samza、Spark、Flink大資料框架HadoopSparkORM
- Hadoop大資料開發框架學習Hadoop大資料框架
- 《Hadoop+Spark大資料分析實戰》簡介HadoopSpark大資料
- 大資料開發過程中的5個通用步驟大資料
- Spark shuffle調優Spark
- Hadoop Shuffle詳解Hadoop
- Spark的Shuffle總結分析Spark
- 【Spark篇】---Spark中Shuffle檔案的定址Spark
- 大資料開發-Spark Join原理詳解大資料Spark
- 每週一書《Spark與Hadoop大資料分析》分享!SparkHadoop大資料
- 免費課程 | 大資料系列免費視訊教程(Linux、Hadoop、Spark、Kylin、Hive等)大資料LinuxHadoopSparkHive
- 大資料學習,大資料發展趨勢和Spark介紹大資料Spark
- hadoop和spark的區別HadoopSpark
- 好程式設計師分享大資料入門教程:Hadoop和spark的效能比較程式設計師大資料HadoopSpark
- 好程式設計師大資料培訓分享常見的Hadoop和Spark專案程式設計師大資料HadoopSpark
- 大資料架構師必讀:常見的七種Hadoop和Spark專案案例大資料架構HadoopSpark
- Spark學習——排序ShuffleSpark排序
- 資料庫和資料湖的關鍵概念性差異資料庫
- 大資料開發過程中Kafka日誌結構解析大資料Kafka
- 資料演算法 Hadoop/Spark大資料處理---第十六章演算法HadoopSpark大資料
- 大資料開發過程中的5個學習通用步驟大資料
- 大資料開發-Spark-初識Spark-Graph && 快速入門大資料Spark
- Spark面試題(八)——Spark的Shuffle配置調優Spark面試題
- 資料演算法 Hadoop/Spark大資料處理---第十二章演算法HadoopSpark大資料
- 大資料Storm相比於Spark、Hadoop有哪些優勢(摘錄)大資料ORMSparkHadoop
- [譯] Python 與大資料:Airflow、 Jupyter Notebook 與 Hadoop 3、Spark、PrestoPython大資料AIHadoopSparkREST
- Spark的兩種核心Shuffle詳解Spark
- 大資料分析過程是如何的大資料
- 大資料hadoop資料大資料Hadoop
- 大資料和Hadoop什麼關係?為什麼大資料要學習Hadoop?大資料Hadoop
- 學習大資料必須瞭解的大資料開發課程大綱大資料
- Vue.js原始碼角度:剖析模版和資料渲染成最終的DOM的過程Vue.js原始碼
- 如何掌握Spark和Hadoop的架構SparkHadoop架構