MapReduce排序机制(Hadoop)

在MapReduce中,排序的目的是为了方便Reduce阶段的处理,通常是为了将相同键的键值对聚合在一起,以便进行聚合操作或其他处理。
在这里插入图片描述


1. Map阶段的局部排序(Local Sorting):

  • 对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使
    用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数
    据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。

  • 在Map阶段,通常会对Mapper输出的键值对进行局部排序,以便后续的合并或传递给Reducer。

  • 这个排序过程在每个Mapper任务内部进行,不涉及跨节点的通信。

  • 一般来说,局部排序可以使用内部排序算法,比如快速排序(Quicksort)、归并排序(Mergesort)或堆排序(Heapsort)等。这些算法在排序小规模数据时都有很好的性能表现。

  • 这种排序是为了将相同键的键值对聚集在一起,以便后续的合并操作或者直接传递给Reducer进行处理。

  • 通常情况下,Map阶段的输出会根据键进行排序,并不要求所有Mapper输出的数据都需要进行全局排序


2.Combiner阶段的局部合并(Local Merging):

  • 在Map阶段输出数据到Reduce之前,可能会使用Combiner对Mapper输出的中间结果进行局部合并。

  • 这个合并过程可以减少数据传输和提高效率,通常也会涉及排序以便合并相同键的键值对。

  • 类似于Map阶段局部排序,可以使用内部排序算法来实现。

- 示例:
在这里插入图片描述
在这里插入图片描述


3. ShuffleSort阶段:

  • MapReduce框架将Mapper输出的键值对根据键进行分区(Partition
    mapreduce分区机制

  • 每个分区的数据将被发送到相应的Reducer节点。

  • 传输过程中,框架会对数据进行排序(Sort),以确保每个Reducer节点接收到的数据是有序的。

  • 通常使用稳定的排序算法,如归并排序,以确保相同键的键值对在排序后仍然保持相对顺序。

  • 这个排序过程可以是基于键的排序,保证Reduce阶段处理的数据是按照键的顺序排列的。

4. Reduce阶段:

  • ShuffleSort阶段,数据会在传输过程中进行排序,以确保每个Reducer接收到的数据是按照键的顺序排列的。

  • 因此,Reduce阶段,数据已经是有序的,Reduce任务只需要按照接收到的键值对的顺序进行处理即可,无需再进行额外的排序操作。

  • Reduce任务接收到来自各个Mapper的分区数据。

  • Reduce任务按照接收到的键值对的顺序进行处理,从而保证输出也是有序的。


5.排序的实现方式:

MapReduce框架通常会提供默认的排序机制,但也允许用户根据具体需求进行定制化。一般来说,排序机制的实现主要依赖于以下两个方面:

a. 键的比较器(Key Comparator):

键的比较器用于确定两个键的顺序关系,从而实现排序。通常情况下,MapReduce框架会要求用户实现一个自定义的比较器,用于比较键的大小关系。用户可以根据键的类型和排序需求来编写自定义的比较器。

b. 分区函数(Partitioning Function):

分区函数决定了键值对如何被分配到不同的Reduce任务中。

在排序过程中,分区函数会根据键的大小将键值对划分到不同的分区中,从而保证在Reduce阶段每个Reduce任务都能处理一组有序的键值对。


7.WritableComparable 排序

WritableComparable 排序是指在 Hadoop 中对自定义数据类型进行排序。在 Hadoop MapReduce 中,键值对是主要的数据单元,当 MapReduce 作业执行过程中需要排序时,通常是根据键进行排序。而要对键进行排序,键的类型必须实现 WritableComparable 接口。

WritableComparable 接口

WritableComparable 接口是 Hadoop 中的一个接口,它继承自 Writable 接口,并添加了 Comparable 接口的功能。它定义了两个方法:

  1. write(DataOutput out):将对象的字段按照指定的顺序写入 DataOutput 流中,以便序列化。
  2. compareTo(T o):比较当前对象与指定对象的顺序。返回值为负数表示当前对象在指定对象之前,返回值为零表示两个对象相等,返回值为正数表示当前对象在指定对象之后。

通过实现 WritableComparable 接口,可以指定如何比较自定义数据类型的对象,并且在 Hadoop MapReduce 作业中进行排序。

示例

假设有一个自定义的键类型 CustomKey,其中包含两个字段 value1value2,需要根据 value1 字段进行排序。为了实现这个排序功能,需要按照以下步骤进行:

  1. CustomKey 类实现 WritableComparable<CustomKey> 接口,并重写其中的方法 writecompareTo
  2. compareTo 方法中,指定按照 value1 字段进行排序的逻辑。
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;public class CustomKey implements WritableComparable<CustomKey> {private int value1;private int value2;// 省略构造函数和其他方法@Overridepublic void write(DataOutput out) throws IOException {out.writeInt(value1);out.writeInt(value2);}@Overridepublic void readFields(DataInput in) throws IOException {value1 = in.readInt();value2 = in.readInt();}@Overridepublic int compareTo(CustomKey o) {// 按照 value1 字段进行比较if (this.value1 < o.value1) {return -1;} else if (this.value1 > o.value1) {return 1;} else {// 如果 value1 相等,则按照 value2 字段进行比较return Integer.compare(this.value2, o.value2);}}
}

通过实现 WritableComparable 接口并重写 compareTo 方法,可以指定在 Hadoop MapReduce 作业中对 CustomKey 对象进行排序的逻辑。然后,将 CustomKey 类用作 MapReduce 作业的输出键类型,作业执行过程中就会根据指定的排序逻辑对键进行排序。


6.示例

假设我们有一个文本文件,其中包含一些单词及其出现的次数。我们希望使用MapReduce来对这些单词按照字母顺序进行排序,并统计每个单词出现的总次数。

1. Map阶段:

假设我们有以下输入数据:

apple 1
banana 2
apple 3
banana 1
cat 2

Map阶段,我们的Mapper任务将处理这些数据,并生成中间键值对。每个键值对的键是单词,值是该单词出现的次数。

Mapper的输出可能如下所示(假设我们有两个Mapper任务):
Mapper 1输出:

apple 1
banana 2

Mapper 2输出:

apple 3
banana 1
cat 2

每个Mapper输出的键值对按照键进行局部排序。

2. Combiner阶段:

在本地,Combiner会对Mapper输出的中间结果进行合并,以减少数据传输量。假设Combiner合并后的结果如下:

apple 4
banana 3
cat 2

Combiner合并了相同键的键值对,并将它们的值相加。

3. ShuffleSort阶段:

MapReduce框架将Combiner输出的键值对根据键进行分区,并在传输过程中进行排序。假设我们有两个Reducer节点,并且我们使用哈希分区函数将键值对分配到Reducer节点。

Reducer 1接收到的分区数据:

apple 4
banana 3

Reducer 2接收到的分区数据:

cat 2

在传输过程中,数据已经根据键进行了排序。

4. Reduce阶段:

每个Reducer按照接收到的键值对的顺序进行处理。假设我们的Reduce函数只是简单地将每个单词的总次数进行累加。

Reducer 1输出:

apple 4
banana 3

Reducer 2输出:

cat 2

每个Reducer的输出都是按照键的顺序排列的。

这就是一个简单的MapReduce排序机制的示例。在这个过程中,数据在Map阶段进行了局部排序,然后在ShuffleSort阶段进行了全局排序,最终在Reduce阶段输出了有序的结果。


总结:

排序是MapReduce中非常重要的一个环节,它决定了在Reduce阶段如何对键值对进行处理。通过合适的排序机制,可以确保Reduce任务能够高效地处理数据,并且保证处理结果的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫-----深入了解 requests 库下篇(第二十五天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

一文学会 ts 构建工具 —— tsup

文章目录 能打包什么&#xff1f;安装用法自定义配置文件条件配置在 package.json 中配置多入口打包生成类型声明文件sourcemap生成格式自定义输出文件代码分割产物目标环境支持 es5编译的环境变量对开发命令行工具友好监听模式 watch提供成功构建的钩子 onSuccess压缩产物 min…

RocketMQ学习笔记

kafka适合于日志收集的场景&#xff08;不需要太多topic&#xff1b;topic下面的partition多了会造成写文件的速度变慢&#xff0c;因为要造很多索引&#xff09; RocketMQ更适合于电商场景&#xff08;适用于topic特别多的情况&#xff09; 快速安装RocketMQ RocketMQ的官网…

C++进阶:搜索树

目录 1. 二叉搜索树1.1 二叉搜索树的结构1.2 二叉搜索树的接口及其优点与不足1.3 二叉搜索树自实现1.3.1 二叉树结点结构1.3.2 查找1.3.3 插入1.3.4 删除1.3.5 中序遍历 2. 二叉树进阶相关练习2.1 根据二叉树创建字符串2.2 二叉树的层序遍历I2.3 二叉树层序遍历II2.4 二叉树最近…

一、MinIO基本知识

MinIO基本知识 一、简介1.许可 二、部署1.Docker部署1.1 部署容器 1.2 MinIO页面访问1.3 创建Bucket![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6c8aa92975f146b691f1f36ce1033e7c.png) 三、Python-API1.安装包2.Bucket、Object概念3.Bucket-API4.MinIOClient-…

C++修炼之路之多态--多态的条件与例外,重载+重写+重定义

目录 前言 一&#xff1a;构成多态的条件及一些特殊情况&#xff08;前提是构成父子类&#xff09; 1.多态是在不同的继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的结果 2.两个条件 3.三同的两个例外 1.协变---返回值类型可以不同&#xff0c;但必…

c++ qt6.5 打包sqlite组件无法使用,尽然 也需要dll支持!这和开发php 有什么区别!

运行 程序会默认使用当前所在文件夹中的 dll 文件&#xff0c;若文件不存在&#xff0c;会使用系统环境变量路径中的文件&#xff1b;又或者是需要在程序源代码中明确指定使用的 dll 的路径。由于我安装 Qt 时将相关 dll 文件路径都添加到了系统环境变量中&#xff0c;所以即使…

【R语言】混合图:小提琴图+箱线图

{ggstatsplot} 是 {ggplot2} 包的扩展&#xff0c;用于创建图形&#xff0c;其中包含信息丰富的绘图本身中包含的统计测试的详细信息。在典型的探索性数据分析工作流程中&#xff0c;数据可视化和统计建模是两个不同的阶段&#xff1a;可视化通知建模&#xff0c;而建模又可以建…

MapReduce工作流程(Hadoop3.x)

MapReduce 是一种用于并行处理大规模数据集的——编程模型和处理框架。它通常用于分布式计算环境中&#xff0c;如Apache Hadoop。 工作流程 1. 切分阶段&#xff08;Splitting&#xff09;&#xff1a; 数据集被分成多个数据块&#xff0c;每个数据块的大小通常在64MB到12…

kaggle 泰坦尼克使用xgboost 得分0.73684

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

zabbix自定义监控、自动发现和注册以及代理设置

前言 监控项的定制和新设备的注册往往需要大量手动操作&#xff0c;这会导致维护成本的增加和监控效率的降低。本文将介绍如何利用 Zabbix 的自定义功能&#xff0c;实现监控项的动态发布和新设备的自动注册以及代理设置、从而简化运维工作并实现更高效的监控管理。 Zabbix 监…

【大模型开源篇1】彦宏您怎么看LLaMA3的开源

Meta LLaMA是Meta公司开源的大模型&#xff0c;作为大模型开源界得鼻祖&#xff0c; 刚刚发布LLaMA3。从ChatGPT 拉开了大模型竞赛的序幕&#xff0c;Meta 选择了开源&#xff0c;至此大模型也开始百花齐放的时期&#xff0c;但是开源模型一直无法超过必源模型&#xff0c;如今…

EA包图上嵌套的包位置不对

Extreme 2024-4-11 11:36 我从工具栏把一个包拖在另一个包里面&#xff0c;可是项目树上两个包的位置并列&#xff0c;拖了几次结果都一样。我的目的是做一个多层级的包图&#xff0c;是不是&#xff08;EA&#xff09;不能在图上做&#xff1f; UMLChina潘加宇 确实是这样&a…

Python可视化数据分析-饼状图

一、前言 饼状图&#xff08;Pie Chart&#xff09;是一种常用的数据可视化图表&#xff0c;用于展示数据中各部分的占比关系。Python 中有多种库可以用于绘制饼状图&#xff0c;比较常用的包括 matplotlib、pyecharts和 plotly 等。 二、使用 matplotlib 绘制饼状图 import…

必应bing搜索国内广告投放开户价格?

搜索引擎广告作为精准引流的重要手段之一&#xff0c;受到了众多企业的青睐&#xff0c;其中微软旗下的必应搜索&#xff08;Bing&#xff09;&#xff0c;以其独特的市场定位和用户群体&#xff0c;成为了不可忽视的广告投放平台。对于想要在中国市场利用必应搜索进行广告投放…

局域网无法连接怎么办?

局域网连接是我们日常生活和工作中常用的方式之一&#xff0c;但有时我们可能会遇到局域网无法连接的问题。这给我们的工作和生活带来了很大的困扰。本文将介绍局域网无法连接的常见原因&#xff0c;并推荐一款名为【天联】的组网产品&#xff0c;它能够解决不同地区间的局域网…

Google Earth Engine 洪水制图 - 使用 Sentinel-1 SAR GRD

Sentinel-1 提供从具有双极化功能的 C 波段合成孔径雷达 (SAR) 设备获得的信息。该数据包括地面范围检测 (GRD) 场景,这些场景已通过 Sentinel-1 工具箱进行处理,以创建经过校准和正射校正的产品。该集合每天都会更新,新获得的资产会在可用后两天内添加。 该集合包含所有 G…

Delphi Firemonkey使用TVertScrollbox自定义列表数据

界面布局设置如下 创建一个过程添加新项目 procedure TForm1.AddItem(name: string; age: Integer); varlayout: TLayout; begin// 设置姓名标签的文本Label3.Text : name;// 设置年龄标签的文本Label4.Text : IntToStr(age);// 克隆 Layout1&#xff0c;并将克隆得到的对象赋值…

FastJson2中FastJsonHttpMessageConverter找不到类问题

问题描述 如果你最近也在升级FastJson到FastJson2版本&#xff0c;而跟我一样也遇到了FastJsonHttpMessageConverter找不到类问题以及FastJsonConfig找不到问题&#xff0c;那么恭喜你&#xff0c;看完本文&#xff0c;安装完fastjson2、fastjson2-extension、fastjson2-exte…

STM32H743驱动SD卡(1)

本文内容参考&#xff1a; STM32——SDIO的学习&#xff08;驱动SD卡&#xff09;&#xff08;理论篇&#xff09;-CSDN博客 STM32个人笔记-SDIO接口-CSDN博客 STM32-(40)&#xff1a;SD卡与SDIO-CSDN博客 【STM32】使用SDIO进行SD卡读写&#xff08;一&#xff09;-初步认…