Hadoop、Spark、Flink Shuffle對比

一、Hadoop的shuffle

前置知識:

Map任務的數量由Hadoop框架自動計算,等于分片數量,等于輸入文件總大小 / 分片大小,分片大小為HDFS默認值128M,可調

Reduce任務數由用戶在作業提交時通過Job.setNumReduceTasks(int)設置

數據分配到Reduce任務的時間點,在Map任務執行期間,通過Partitioner(分區器)確定每個鍵值對的目標Reduce分區。默認采取partition=hash(key)?%?numReduceTasks策略

Shuffle過程:

hadoop會先將map數據寫入緩沖區,緩沖區達到某個閾值后,會把數據溢寫至磁盤,溢寫磁盤時會根據先將數據寫入相應分區文件,進行排序

溢寫完畢后,會將多個分區文件合并,再進行歸并排序

Reduce任務主動從所有Map任務的磁盤中拉取(Pull)屬于自己分區的數據,拉取到數據后,還會進行一次歸并排序

可以看到一共進行了三次排序。這一設計是后來所有分布式計算框架混洗任務的基石。

QA:為什么Hadoop需要三次排序?

第一次排序是為了第二次歸并排序方便

第二次歸并排序是為了給reduce任務時,reduce任務可以順序讀

第三次排序是因為hadoop要保證同一個reduce的輸出是有序的,同時如果輸入的key是有序的,reduce處理完輸出即可,如果是無序的,那么reduce需要保存再重排序,對于數據量大的場景容易oom

二、Spark的shuffle

前置知識:

map個數由Saprk分區數計算或者自定義,reduce個數由用戶指定,如果沒指定,通常是機器核數

map和reduce數據的交互方式依舊是,map后把數據寫入文件中,reduce從文件中讀取數據


分區ID是數據在Shuffle過程中被分配到的目標Reduce任務的編號,決定了數據最終由哪個Reduce任務處理。

計算方式
默認使用HashPartitioner,根據Key的哈希值對Reduce任務數取模:

分區ID=hash(key)?%?numReduceTasks分區ID=hash(key)?%?numReduceTasks

2.1 哈希混洗

Spark 1.2 之前默認的Shuffle機制

map輸出的數據不再排序,若有M個map任務和R個reduce任務,每個map任務生成R個文件,每個reduce任務拉取屬于自己的文件

這樣導致文件句柄數太多了,若M=1000R=1000,則生成?1,000,000個文件,同時內存壓力也比較大,如果需要排序要在reduce端把一個key的所有數據全部加載,所以后面使用了sort混洗

2.2 sort 混洗

Spark 1.2 引入,逐步成為默認機制

1. Map任務處理輸入數據,生成<Key, Value>對,并按分區ID暫存到內存緩沖區

2. 當緩沖區達到閾值(如spark.shuffle.spill.numElementsForceSpillThreshold默認值)時,開始排序。

  • 排序規則

    • 僅按分區ID排序(默認):將數據按分區ID排序,同一分區內的數據無序。

    • 按分區ID + Key排序(需配置):
      若設置spark.shuffle.sort.byKey=true,則按(分區ID, Key)排序,同一分區內的數據按鍵有序。

3. 排序后的數據按分區ID順序寫入磁盤,生成一個臨時溢寫文件

4. Map任務結束時,將所有臨時溢寫文件合并為單個數據文件data)和一個索引文件index

  • 合并方式

    • 多路歸并排序:將多個已按分區ID(或Key)排序的溢寫文件合并,保持全局有序性。

    • 索引文件生成:記錄每個分區ID在數據文件中的起始和結束偏移量。

5.?Reduce任務向Driver查詢所有Map任務生成的數據文件和索引文件的位置

6.?若Map端已按Key排序,Reduce任務直接對多個有序數據塊進行歸并,生成全局有序數據集。

  • 內存與磁盤結合

    • 數據量較小時,直接在內存中歸并。

    • 數據量較大時,使用外排序(溢出到磁盤,分批次歸并

感覺這樣下來,跟hadoop的shuffle就有點像了,這樣有個好處是,map生成的文件就只有兩個了,最終的文件就是 2 * R個

2.3 Spark和Hadoop shuffle的內存使用上的不同之處

Hadoop寫文件時,是設置了一個內存閾值,到達了該閾值就會把內存內容寫入文件中,比如閾值是80M,一個200M文件就要溢寫三次,且緩沖區大小不可動態調整,無法根據任務需求擴展或收縮。

Spark 將內存劃分為?存儲內存(Storage Memory)?和?執行內存(Execution Memory),兩者可動態借用,

  1. Map 任務將數據按分區ID(或 Key)緩存在內存中。

  2. 溢出到磁盤:若內存不足,部分數據排序后寫入磁盤臨時文件。

  3. 合并最終文件:Map 結束時合并內存和磁盤數據,生成一個數據文件和一個索引文件。

舉個spark處理數據的例子,假設有200MB數據:

(1) 內存排序

  • Map 任務處理數據后,先將鍵值對緩存在內存中,并按?分區ID(和可選的 Key)排序。

  • 假設可用執行內存為 150MB,前 150MB 數據在內存中完成排序,生成一個?有序的內存塊

(2) 溢出到磁盤

  • 當內存不足時,Spark 將內存中已排序的 150MB 數據?溢寫到磁盤,生成一個臨時文件(如?spill1),該文件內部保持有序。

  • 剩余 50MB 數據繼續在內存中排序,直到 Map 任務結束。

在 Map 任務結束時,所有內存和磁盤上的數據會被合并為一個全局有序的輸出文件。具體流程如下:

假設 Map 任務生成以下兩個有序片段:

  • 內存塊(150MB)[A, B, D, F]

  • 溢寫文件(50MB)[C, E, G]

歸并過程

  1. 初始化指針:內存塊指向?A,溢寫文件指向?C

  2. 比較當前元素,選擇最小者:

    • 第一輪:A(內存塊) → 寫入最終文件。

    • 第二輪:B(內存塊) → 寫入最終文件。

    • 第三輪:C(溢寫文件) → 寫入最終文件。

    • ...

  3. 最終合并結果:[A, B, C, D, E, F, G]

reduce階段拉取數據的時候,會優先從內存中獲取,內存中沒有才去文件中獲取

三、Flink的shuffle

雖然Flink是批流一體的,因為Flink現在主要是作為流處理,所以我們分析Flink在流處理場景下的shuffle

因為Flink處理的是流數據,自然不會有上面介紹的批處理的那些從文件中拉取數據,文件歸并排序之類的操作

如果硬要說的話,Flink是哈希混洗,用戶定義上游算子和下游算子的并發度,上游算子的數據默認會采用?Round-Robin 輪詢算法,通過rpc(netty)發給下游的算子,在Flink UI圖中我們會看到圖中的線是 Rebalance

如果有key by,那么會對key做hash,然后對并發度取模,根據取模結果發送給下游算子

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71628.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker的常用鏡像

Docker的常用鏡像命令主要包括鏡像的查看、搜索、拉取、刪除、構建等操作&#xff0c;以下是綜合多個來源的總結&#xff1a; 一、基礎鏡像操作 查看本地鏡像 docker images? 顯示所有本地鏡像&#xff0c;包含倉庫名&#xff08;REPOSITORY&#xff09;、標簽&#xff08;TAG…

車載以太網測試-3【Wireshark介紹】

1 摘要 Wireshark 是一款開源的網絡協議分析工具&#xff0c;廣泛用于網絡故障排查、協議分析、網絡安全檢測等領域。它能夠捕獲網絡數據包&#xff0c;并以詳細的、可讀的格式顯示這些數據包的內容。廣泛應用于車載網絡測試&#xff0c;是車載網絡測試工程師必須掌握的工具。…

基于跨模態地圖學習的視覺語言導航

前言 本工作開展的背景&#xff1a; 人類和其他物種構建類似地圖的環境表示來完成尋路&#xff1a; &#xff08;1&#xff09;當人類只使用現成的駕駛或步行路徑到達目標時&#xff0c;構建認知地圖和獲取空間知識的能力就會下降&#xff1b; &#xff08;2&#xff09;另…

nodejs關于后端服務開發的探究

前提 在當前的環境中關于web server的主流開發基本上都是java、php之類的&#xff0c;其中java spring系列基本上占了大頭&#xff0c;而python之流也在奮起直追&#xff0c;但別忘了nodejs也是可以做這個服務的&#xff0c;只是位置有點尷尬&#xff0c;現在就來探究下nodejs…

Ubuntu20.04本地配置IsaacGym Preview 4的G1訓練環境(一)

Ubuntu20.04本地配置IsaacGym Preview 4的G1訓練環境 配置conda虛擬環境安裝pytorch、cuda和cudnn安裝IsaacGym Preview 4配置rsl_rl配置unitree_rl_gym配置unitree_sdk2py 寫在前面&#xff0c;要求完成anaconda配置&#xff0c;若沒完成&#xff0c;請參考本人其余博客&#…

RangeError: Maximum call stack size exceeded

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

八卡5090服務器首發亮相!

AI 人工智能領域熱度居高不下。OpenAI 的 GPT - 4 憑強悍語言處理能力&#xff0c;在內容創作、智能客服等領域廣泛應用。清華大學團隊的 DeepSeek 大模型在深度學習訓練優勢突出&#xff0c;正促使各行業應用端算力需求向推理主導轉變&#xff0c;呈爆發式增長 。 隨著 DeepS…

計算機視覺|Swin Transformer:視覺 Transformer 的新方向

一、引言 在計算機視覺領域的發展歷程中&#xff0c;卷積神經網絡&#xff08;CNN&#xff09; 長期占據主導地位。從早期的 LeNet 到后來的 AlexNet、VGGNet、ResNet 等&#xff0c;CNN 在圖像分類、目標檢測、語義分割等任務中取得了顯著成果。然而&#xff0c;CNN 在捕捉全…

【Leetcode 每日一題】2597. 美麗子集的數目

問題背景 給你一個由正整數組成的數組 n u m s nums nums 和一個 正 整數 k k k。 如果 n u m s nums nums 的子集中&#xff0c;任意兩個整數的絕對差均不等于 k k k&#xff0c;則認為該子數組是一個 美麗 子集。 返回數組 n u m s nums nums 中 非空 且 美麗 的子集數…

常見Web應用源碼泄露問題

文章目錄 前言一、常見的源碼泄露漏洞git源碼泄露SVN源碼泄露DS_Store文件泄漏網站備份壓縮文件泄露WEB-INF/web.xml泄露CVS泄露.hg源碼泄露Bazaar/bzr泄露.swp文件泄露 前言 在Web應用方面對于安全來說&#xff0c;可能大家對SQL注入、XSS跨站腳本攻擊、文件上傳等一些漏洞已…

記錄一次wifi版有人物聯串口服務器調試經過

1、首先買了一個華為的wifi路由器&#xff0c;連接上以后&#xff0c;設置好網絡名字和wifi密碼 2、用網線連接串口服務器&#xff0c;通過192.168.1.1登錄&#xff0c;進行配置 找到無線客戶端配置&#xff0c;先在基本配置中打開5G配置&#xff0c;然后再去5.8G配置中設置 …

Android 平臺架構系統啟動流程詳解

目錄 一、平臺架構模塊 1.1 Linux 內核 1.2 硬件抽象層 (HAL) 1.3 Android 運行時 1.4 原生 C/C 庫 1.5 Java API 框架 1.6 系統應用 二、系統啟動流程 2.1 Bootloader階段 2.2 內核啟動 2.3 Init進程&#xff08;PID 1&#xff09; 2.4 Zygote與System Serv…

【Windows下Gitbook快速入門使用】

Windows下Gitbook快速入門使用 1 工具安裝1.1 Node.js下載安裝1.1 環境變量1.2 npm配置1.3 安裝gitbook 2 gitbook使用2.1 gitbook 無法執行2.2 gitbook常用命令 Gitbook是一個軟件&#xff0c;使用Git和Markdown來編排書本&#xff1b; GitBook helps you pushlish beautiful …

RK3588V2--HYM8563TS RTC 實時時鐘適配移植

1. 什么是RTC RTC&#xff08;Real-Time Clock&#xff0c;實時時鐘&#xff09;是一種電子設備或芯片&#xff0c;它用于保持當前時間和日期&#xff0c;即使系統關閉或斷電也能持續計時。RTC 通常用于計算機、嵌入式系統、物聯網設備等需要精確時間管理的場景。 1.1 RTC 的…

MHA集群

一.MHA集群 MHA master high avavibility 主服務器高可用 如上圖所示&#xff0c;我們之前說過&#xff0c;如果在主從復制架構中主服務器出現故障&#xff0c;就需要我們將從服務器作為主服務器&#xff0c;等故障的主服務器修復好之后&#xff0c;再將修好的主服務器作為從服…

10 【HarmonyOS NEXT】 仿uv-ui組件開發之Avatar頭像組件開發教程(一)

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 目錄 第一篇&#xff1a;Avatar 組件基礎概念與設計1. 組件概述2. 接口設計2.1 形狀類型定義2.2 尺寸類型定義2.3 組件屬性接口 3. 設計原則4. 使用…

微信小程序+SpringBoot的單詞學習小程序平臺(程序+論文+講解+安裝+修改+售后)

感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;我會一一回復&#xff0c;希望幫助更多的人。 系統背景 &#xff08;一&#xff09;社會需求背景 在全球化的大背景下&#xff0c;英語作為國際…

鴻蒙HarmonyOS評論功能小demo

評論頁面小demo 效果展示 1.拆解組件&#xff0c;分層搭建 我們將整個評論頁面拆解為三個組件&#xff0c;分別是頭部導航&#xff0c;評論項&#xff0c;回復三個部分&#xff0c;然后統一在index界面導入 2.頭部導航界面搭建 Preview Component struct HmNavBar {// 屬性&a…

解析 SQL,就用 sqlparse!

文章目錄 解析 SQL&#xff0c;就用 sqlparse&#xff01;一、背景&#xff1a;為什么你需要 sqlparse&#xff1f;二、什么是 sqlparse&#xff1f;三、如何安裝 sqlparse&#xff1f;四、簡單易用的庫函數1\. parse(sql)2\. format(sql, **options)3\. split(sql)4\. get_typ…

點云軟件VeloView開發環境搭建與編譯

官方編譯說明 LidarView / LidarView-Superbuild GitLab 我的編譯過程&#xff1a; 安裝vs2019&#xff0c;windows sdk&#xff0c;qt5.14.2&#xff08;沒安裝到5.15.7&#xff09;&#xff0c;git&#xff0c;cmake3.31&#xff0c;python3.7.9&#xff0c;ninja下載放到…