MapReduce的shuffle过程详解

embedded/2024/12/24 9:14:52/

文章目录

  • MapReduce的shuffle过程详解
    • 一、引言
    • 二、Shuffle过程详解
      • 1、Map端Shuffle
        • 1.1、分区(Partition)
        • 1.2、排序(Sort)
        • 1.3、分割(Spill)
      • 2、Reduce端Shuffle
    • 三、使用示例
    • 四、总结

MapReduce的shuffle过程详解

一、引言

MapReduce框架中的Shuffle过程是连接Map阶段和Reduce阶段的桥梁,负责将Map任务的输出结果按照key进行分组和排序,并将相同key的数据传递给对应的Reduce任务进行处理。Shuffle过程的性能直接影响到整个MapReduce作业的执行效率。

二、Shuffle过程详解

在这里插入图片描述
在这里插入图片描述

1、Map端Shuffle

Map端的Shuffle主要涉及分区(Partition)、排序(Sort)和分割(Spill)操作。Map任务输出的中间数据首先被送到一个内存缓冲区,当缓冲区达到一定大小时,会触发Spill操作,将数据写入磁盘,并进行分区和排序。

1.1、分区(Partition)

Map输出的数据根据Partitioner的规则被分配到不同的Reducer分区中。默认情况下,是根据key的哈希值进行分区。

public int getPartition(Key key, Value value, int numReduceTasks) {// 默认分区方法,根据key的hashCode进行取模return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
1.2、排序(Sort)

为了保证同一个Reducer分区内的数据有序,Map端会对每个分区的数据进行排序。排序可以是快速排序、归并排序等算法。

1.3、分割(Spill)

当内存缓冲区达到一定阈值时,会将数据写入磁盘,这个过程称为Spill。Spill操作会生成多个中间文件,每个文件对应一个Reducer分区。

2、Reduce端Shuffle

Reduce端的Shuffle主要负责从Map端拉取数据,并进行合并(Merge)操作。Reduce任务首先会从各个Map任务拉取对应的数据分区,然后对这些数据进行合并,以便进行后续的Reduce操作。

public void reduce(ShuffledInputSplit split, TaskAttemptContext context) throws IOException {// 从Map端拉取数据RawKeyValueIterator rIter = shuffleConsumerPlugin.run();// 合并数据mergeAndReduce(rIter);
}

三、使用示例

下面是一个简单的MapReduce示例,展示了Shuffle过程在实际应用中的使用。

public class WordCount {public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}context.write(key, new IntWritable(sum));}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

四、总结

Shuffle过程是MapReduce框架中不可或缺的一部分,它确保了Map阶段输出的数据能够有序、高效地传递给Reduce阶段。通过对Shuffle过程的深入了解和优化,可以显著提升MapReduce作业的性能。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • MapReduce Shuffle源码解读
  • MapReduce的Shuffle过程的七大操作

http://www.ppmy.cn/embedded/148296.html

相关文章

stm32中有哪些库?其中标准库和HAL库有什么区别?

stm32中有哪些库&#xff1f; 1. STM32标准外设库&#xff08;Standard Peripheral Library&#xff09; 介绍&#xff1a;STM32 标准外设库是 STM32 官方提供的一个硬件抽象库&#xff0c;旨在简化对 STM32 各类外设&#xff08;如 GPIO、UART、SPI、I2C、ADC、PWM 等&#x…

(补)算法刷题Day24: BM61 矩阵最长递增路径

题目链接 思路 方法一&#xff1a;dfs暴力回溯 使用原始used数组4个方向遍历框架 &#xff0c; 全局添加一个最大值判断最大的路径长度。 方法二&#xff1a;加上dp数组记忆的优雅回溯 抛弃掉used数组&#xff0c;使用dp数组来记忆遍历过的节点的最长递增路径长度。每遍历到已…

LeetCode 209. 长度最小的子数组 (C++实现)

1. 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输…

32岁前端干了8年,是继续做前端开发,还是转其它工作

前端发展有瓶颈&#xff0c;变来变去都是那一套&#xff0c;只是换了框架换了环境。换了框架后又得去学习&#xff0c;虽然很快上手&#xff0c;但是那些刚毕业的也很快上手了&#xff0c;入门门槛越来越低&#xff0c;想转行或继续卷&#xff0c;该如何破圈 这是一位网友的自述…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…

uniapp .gitignore

打开HBuilderX&#xff0c;在项目根目录下新建文件 .gitignore复制下面内容 #忽略unpackge目录下除了res目录的所有目录 unpackage/* !unpackage/res/#忽略.hbuilderx目录 .hbuilderx# 忽略node_modules目录下的所有文件 node_modules/# 忽略锁文件 package-lock.json yarn.l…

【Chrome Extension】一、CSDN计时扩展设计

【Chrome Extension】一、CSDN计时扩展设计 重点内容内容脚本 content_scripts 文件目录1、整体目录2、manifest.json3、scripts/content.js4、css/content.css 重点内容 内容脚本 content_scripts 1、manifest.json文件配置 {"manifest_version": 3, # *依赖Chro…

Debian 10上使用UFW设置防火墙

介绍 UFW或Uncomplicated Firewall是iptables一个接口&#xff0c;旨在简化配置防火墙的过程。 虽然iptables是一个可靠而灵活的工具&#xff0c;但初学者很难学会如何使用它来正确配置防火墙。 如果您希望开始保护网络并且不确定使用哪种工具&#xff0c;UFW可能是您的正确选…