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.mzph.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下载放到…