MapReduce原理讲解(带源码)

2023-05-16

在MapReduce 中运行的job 类里,最先出现的就是FileInputFormat 类,它继承于InputFormat 。

一、InputFormat:

这是一个重要的抽象类,其中包括两个抽象方法:

//源码:
public abstract class InputFormat<K, V> {
    public InputFormat() {
    }

    public abstract List<InputSplit> getSplits(JobContext var1) throws IOException, InterruptedException;

    public abstract RecordReader<K, V> createRecordReader(InputSplit var1, TaskAttemptContext var2) throws IOException, InterruptedException;
}

1.getSplits

用于分割文件,返回List集合,集合中类型为InputSplit 包装类,其中包括长度、位置等属性。

//源码:
public abstract class InputSplit {
    public InputSplit() {
    }

    public abstract long getLength() throws IOException, InterruptedException;

    public abstract String[] getLocations() throws IOException, InterruptedException;

    @Evolving
    public SplitLocationInfo[] getLocationInfo() throws IOException {
        return null;
    }
}

由于大数据非常“大”,Hadoop 将数据分成128MB的Block块,MapReduce将文件按分隔符(空格、回车或结束符)切割开,放入差不多这个大小的块里,如果放不下就再次切割,然后将块储存在不同节点上。于是为了正常读取,就需要每个块储存节点的位置,块的顺序位置,如果按分隔符切割的切片很大,存放在了不止一个块中,还要先找到完整的切片,组成逻辑块,而如果这些长度、定位信息以属性的形式存在InputSplit类里。

2.createRecordReader

这是一个读取器,作用就是按行读字节流。

二、两个方法的重写

FileInputFormat 继承了InputFormat ,重写了上面的getSplits 方法

1.重写中的getSplits 方法

1.1使用Stopwatch 线程监控,用心跳消息防止文件丢失;

1.2在重写方法中规定最小切割字节

——算数函数取两数最大值:①1字节(1L),②根据任务设置最小切割字节。设置方法:

//写在Job类中
Configuration con = new Configuration();
con.set("mapreduce.input.fileinputformat.split.minsize","1024");
Job job = Job.getInstance(con);//最小分割值设为1024

1.3还规定了最大分割字节

——非常大的一个数。

1.4循环获取位置并记录。

判断文件类型,如果为本地文件(file),就记录本地块位置;如果是读远程文件(hdfs),就获得远程块位置并记录。

1.5获得切割尺寸

——防止超越之前预设的(或默认的)最小值和最大值——取最小切割字节、块尺寸、最大切割字节中中间大小的那个。

1.6进行切割

进入循环比较,看切割尺寸splitSize 和文件长度bytesRemaining 比谁大。(1.1是因为能够容忍稍微超过分割尺寸一点点)

如果文件长度超过了一次切割的长度,那么进入循环,将文件进行分割;

如果文件长度不超过切割尺寸,那边么不进循环,不进行分割。

//至此,已经分好逻辑块了。

2.重写中的createRecordReader 方法

实际上TextInputFormat 类继承了上述FileInputFormat 抽象类,不过框架中new FileInputFormat() 就能调到TextInputFormat。

而createRecordReader 是在TextInputFormat 中被重写的。

//源码:
public class TextInputFormat extends FileInputFormat<LongWritable, Text> {
    public TextInputFormat() {
    }

    public RecordReader<LongWritable, Text> createRecordReader(InputSplit split, TaskAttemptContext context) {
        String delimiter = context.getConfiguration().get("textinputformat.record.delimiter");
        byte[] recordDelimiterBytes = null;
        if (null != delimiter) {
            recordDelimiterBytes = delimiter.getBytes(Charsets.UTF_8);
        }

        return new LineRecordReader(recordDelimiterBytes);
    }

    protected boolean isSplitable(JobContext context, Path file) {
        CompressionCodec codec = (new CompressionCodecFactory(context.getConfiguration())).getCodec(file);
        return null == codec ? true : codec instanceof SplittableCompressionCodec;
    }
}

2.1这个方法返回一个LineRecordReader 类,能够按行读取。

2.2LineRecordReader

这个类中初始化设置每行最大长度2GB左右。然后用FileSystem 读文件。

类中的属性inSplitLineReader 类。

进入源码会发现,实际上它用的是InputStream 字节流读取,

但众所周知,按行读取readLine() 方法是缓冲字符流BufferedReader 的方法,这里使用字节流是没有这个方法的,所以这里的父类LineReader 是自己单独写了个按行读取:

 

自己设缓冲区大小(默认64KB,如果超长可以改),先在这个缓冲区内找换行符"\n"(ascII码=10),然后按缓冲字节数组的大小读入数据。


至此,我们已经得到了文本的逻辑切片。


三、Mapper

1.还记得我们写的mapper吗

操作:写一个继承Mapper 的类,有两个传入值、两个输出值。

经过上面的步骤按行读取,会形成两个值——(k,v)。这两个值经过我们自己写的继承Mapper 的类中的map 方法,会再传出两个新的值(k,v),通过context.write 输出到OutputCollector。两个传入值、两个输出值,这就是我们在map 方法里看到的4个参数。

2.环形缓冲区

上面的InputFormat 的工作相当于把牛肉切成牛排,但要吃的话,还需要咬成小块一口口吃

——为了保证后面每一次处理的数据大概都是一个固定值,这里采用环状数组作为缓冲区,OutputCollector 把收集到的(k,v)放到环形缓冲区,缓冲区默认大小为100MB,但只使用80%,多了就会触发spill溢出(这个过程是对数据进行真正处理之前的一道工序,数据在缓冲区每存好一组就拿去处理一组)

        为什么用环状数组?

        (环状数组使用头尾两个指针移动来判断是在填充数据还是在释放数据,两指针相遇就知道数组满了。相比于普通数组,只需要一个for循环就能解决填充和释放两件事)

        1.环状数组下标永不越界;

        2.空间利用率很高,少个for,只要移动指针就知道是在填充数据还是释放数据。

四、Shuffle

shuffle 是一个过程,每一个步骤分散在map task 和 reduce task 节点上。

设立描述的Shuffle 过程是上面提到的spill 溢出过程。

整体来看,分3个步骤:

1.分区

使用Hash分区,根据Hash值将不同的数据分区。

排序前先给上面缓冲区中的每一对(k,v) hash 一个分区值,相同值的数据分在同一区中。

2.排序

这里用的是快速排序。

将缓冲区中的数据根据分区和key 进行排序,使区内有序。

3.合并

通过spill溢出,不断将分好区排好序的数据溢出到本地磁盘文件,如果map阶段处理的数据量太大,将会溢出成多个文件。

合并使用Combiner 进行局部value ,先合并成小文件,再用归并排序,按区合并成大文件。无论小文件还是大文件,都是区内有序的。

五、Reducer

reduce task 根据自己的分区号,去各个map task 节点上拷贝相同hash分区的数据到reduce task本地磁盘工作目录(这个过程依旧属于Shuffle);

reduce task 会把同一分区来自不同map task 的结果文件再进行归并排序,合并成一个大文件(所以有几个reduce 就分几个区,可以自己设置)

//设置reducer个数
job.setNumReduceTasks(2);

到合并成分区大文件为止,shuffle 过程结束。

最后再使用OutputFormat 将结果写入part-r-000**结果文件.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MapReduce原理讲解(带源码) 的相关文章

  • 国内云桌面架构有哪些?为什么VDI能成为主流

    中国 云电脑 基础架构可划分为VDI架构 IDV架构 VOI架构 xff0c 不同的服务厂商通常会在各自架构中进行一定程度上的定制化 VDI架构 xff08 virtual desktop infrastruscture 虚拟桌面基础架构
  • 【STM32 基础实验蜂鸣器发声】

    文章目录 一 认识蜂鸣器 xff08 1 xff09 蜂鸣器 xff08 2 xff09 蜂鸣器分类 二 基于stm32f10c8t6 基础实验蜂鸣器发声 xff08 1 xff09 本实验蜂鸣器型号说明 xff08 2 xff09 蜂鸣器
  • docker安装

    一 安装前准备 根据不同系统准备安装docker的安装包 xff0c 准备符合docker安装需求的Centos Ubuntu系统 二 Centos系统 安装前准备 1 系统要求 要在 CentOS 上安装 Docker xff0c 最低的
  • Python3入门教程||Python3 正则表达式||Python3 CGI 编程

    Python3 正则表达式 在 Python3 中正则表达式是一个特殊的字符序列 xff0c 它能帮助你方便的检查一个字符串是否与某种模式匹配 Python 自1 5版本起增加了re 模块 xff0c 它提供 Perl 风格的正则表达式模式
  • 树莓派安装qq最新版本 kali安装qq最新版本

    前几天我一个linux老用户看到摆烂摆了4年多的qq for linux竟然更新了 xff0c 必须给我树莓派炫一个 不多说 xff0c 开搞 首先 xff0c 要安装的就是依赖 xff1a sudo apt install libgtk2
  • 玩转你的开发板-1.4.第1季第4部分-朱有鹏-专题视频课程

    玩转你的开发板 1 4 第1季第4部分 1586人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第4个课程 xff0c 主要内容是带领大家玩转课程配套开发板 xff0c 包括 xff1a 开发板的整体配件认识 检测 程
  • Invalid <param> tag: Cannot load command parameter [robot_description]: command [[‘/opt/ros/noetic/l

    Ubuntu20 04 运行LIO SAM遇到这个错误 xff0c 一直解决不掉 xff0c 好像是xacro文件的问题 xff0c 有大佬帮忙看一下吗 xff1f 求求了
  • MDK5 Debug调试方法总结

    常见的Debug方法 连接好硬件DAP之后 xff0c 需要进行一些设置 Debug调试按钮分别对应的功能 按钮1 gt reset复位按钮 按钮2 gt run按钮 xff0c 程序运行按钮 按钮3 gt stop按钮 xff0c 程序停
  • 51单片机(DHT11温湿度传感器)

    一 产品介绍 1 运用场景 xff08 温湿度检测系统 xff09 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 xff0c 应用领域 xff1a 暖通 空调 xff1b 汽车 xff1b 消费品 xff1b 气
  • 单片机毕设分享 智能窗户系统(源码+硬件+论文)

    文章目录 0 前言1 主要功能2 硬件设计 原理图 3 核心软件设计4 实现效果5 最后 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统的毕设题目缺少创新和亮点 xff0c 往往达不到毕业答辩的要
  • Linux——实施高级存储功能(VDO)

    一 stratis存储 xff1a stratis存储是一种高效率管理存储的方式 xff0c 可实施灵活的文件系统 xff0c 使之随数据动态增长 需要安装stratus cli和stratisd软件包 stratis pool creat
  • 毕业设计 基于单片机的智能窗户系统(源码+硬件+论文)

    文章目录 0 前言1 主要功能2 硬件设计 原理图 3 核心软件设计4 实现效果5 最后 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统的毕设题目缺少创新和亮点 xff0c 往往达不到毕业答辩的要
  • 立创EDA怎么批量处理元器件

    1 点击编辑 点击查找相似对象 xff08 也可以按快捷键Ctrl 43 Shift 43 F xff09 2 之后弹出这个对话框 xff0c 搜索你需要的条件 种类 xff1a 选择你需要批量查找的元素类型 范围 xff1a 在当前原理图
  • 超声波模块工作原理

    超声波测距模块工作原理 xff08 1 xff09 采用IO口TRIG触发测距 xff0c 给至少10us的高电平信号 xff08 2 xff09 模块自动发送8个40khz的方波 xff0c 自动检测是否有信号返回 xff1b xff08
  • GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;(学习笔记)

    看原子哥的IIC h文件看到这两个语句有点懵 xff0c 去找了半天资料才懵懵懂懂 xff0c 下面简单记录一下 xff0c 以防下次又忘了 就拿这个举例把 xff0c GPIO一组有 xff08 0 15 xff09 一共16个 前 xf
  • C#public,protected,private,internal,protected internal学习笔记

    比如说 xff1a 一个人A为父类 xff0c 他的儿子B xff0c 妻子C xff0c 私生子D xff08 注 xff1a D不在他家里 xff09 如果我们给A的事情增加修饰符 xff1a 1 public事件 xff1a 地球人都
  • 动手写代码之前必须的准备工作-1.5.第1季第5部分-朱有鹏-专题视频课程

    动手写代码之前必须的准备工作 1 5 第1季第5部分 2423人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第5个课程 xff0c 主要内容是开发环境的搭建 C语言基础知识 数据手册的带读等编程前导知识 学习本课程的
  • Ubuntu:gcc编译报错 fatal error: stdio.h 没有那个文件或目录解决方法

    跟着火哥学习liunx xff0c 在跟着视频学习到第13讲的时候遇到了gcc编译hello c报错的问题 xff0c 也是搞了半天查了很多解决方案都是叫我安装C C 43 43 环境什么的 xff0c 但试了并没有用 xff0c 可能是我
  • 一文教你实现Spring动态启停定时任务

    为什么需要定时任务 定时任务的应用场景十分广泛 xff0c 如定时清理文件 定时生成报表 定时数据同步备份等 Java定时任务的原理 jdk自带的库中 xff0c 有两种技术可以实现定时任务 xff0c 一种是Timer 另一种是 Sche
  • 市面上主流TPMS胎压芯片介绍

    今天的汽车胎压芯片市场是算热闹的 xff0c 相对于2016年时 xff0c 国产 国外的都有了新的变化 xff0c 对产品开发者或者说使用者来说 xff0c 无疑是福音 xff0c 要想国内胎压市场从2005年左右到2016年 xff0c

随机推荐

  • Hbase的安装与配置

    文章目录 Hbase 安装配置一 xff0c 测试Hadoop 安装1 xff0c ssh 免密测试2 xff0c jps 查看进程 二 xff0c 安装Hbase1 xff0c 拷贝Hbase 2 5 0 到 opt 目录下 三 xff0
  • Python 数据可视化的三大步骤

    1 首先 xff0c 要知道我们用哪些库来画图 matplotlib Python中最基本的作图库就是matplotlib xff0c 是一个最基础的Python可视化库 xff0c 一般都是从matplotlib上手Python数据可视化
  • 本文一步一步地教你如何将Python程序打包成exe文件—赶紧进来学习吧

    先来看看几个问题 一 什么是exe可执行文件 xff1f exe文件英文全名是executable file xff0c 翻译为可执行文件 xff08 但它不等于可执行文件 xff09 xff0c 可执行文件包含两种 xff0c 文件扩展名
  • 用python代码画爱心,来自程序猿的浪漫

    不相信python代码可以画爱心 xff1f 先来一张效果图来看看效果吧 xff01 用python代码画爱心的思路是怎样的 xff1f 1 怎么画心形曲线 2 怎么填满心形曲线 3 怎么用 python 画出爱心 接下来看好了 xff0c
  • 从协方差的角度详解线性判别分析原理+Python实现

    目录 写在前面 机器学习强基计划聚焦深度和广度 xff0c 加深对机器学习模型的理解与应用 深 在详细推导算法模型背后的数学原理 xff1b 广 在分析多个机器学习模型 xff1a 决策树 支持向量机 贝叶斯与马尔科夫决策 强化学习等 1
  • Python量化交易实战:获取股票数据并做分析处理

    量化交易 xff08 也称自动化交易 xff09 是一种应用数学模型帮助投资者进行判断 xff0c 并且根据计算机程序发送的指令进行交易的投资方式 xff0c 它极大地减少了投资者情绪波动的影响 量化交易的主要优势如下 xff1a 快速检测
  • Python读取xml文件

    关于python读取xml文章很多 xff0c 但大多文章都是贴一个xml文件 xff0c 然后再贴个处理文件的代码 这样并不利于初学者的学习 xff0c 希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件 什么是xml
  • 单片机控制第一个外设-LED灯-第1季第6部分-朱有鹏-专题视频课程

    单片机控制第一个外设 LED灯 第1季第6部分 3352人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第6个课程 xff0c 主要讲解LED的工作原理和开发板原理图 实践编程等 xff0c 通过学习目的是让大家学会给
  • Python——闭包详解

    在函数编程中经常用到闭包 闭包是什么 xff0c 它是怎么产生的及用来解决什么问题呢 给出字面的定义先 xff1a 闭包是由函数及其相关的引用环境组合而成的实体 即 xff1a 闭包 61 函数 43 引用环境 想想Erlang的外层函数传
  • Python 中的类与继承

    类的定义以及实例的建立 Python中 xff0c 类通过 class 关键字定义 例如最简单的一个类定义可以为 xff1a class Person object pass Python 的编程习惯 xff0c 类名以大写字母开头 xff
  • Python中的type和object详解

    这篇博客主要描述Python的新风格对象 new style objects xff0c 如下 xff1a lt type 39 type 39 gt 和 lt type 39 object 39 gt 分别是什么 xff1f 用户自定义的
  • Python装饰器大详解

    一 作用域 在python中 xff0c 作用域分为两种 全局作用域和局部作用域 全局作用域是定义在文件级别的变量 函数名 而局部作用域 xff0c 则是定义函数内部 关于作用域 xff0c 我们要理解两点 xff1a a 在全局不能访问到
  • 我的Python学习笔记:私有变量

    一 私有变量的定义 在Python中 xff0c 有以下几种方式来定义变量 xff1a xx xff1a 公有变量 xx xff1a 单前置下划线 xff0c 私有化属性或方法 xff0c 类对象和子类可以访问 xff0c from som
  • python三大神器之virtualenv

    pip virtualenv fabric通称为pythoner的三大神器 virtualenv virtualenv 用来建立一个虚拟的python环境 xff0c 一个专属于项目的python环境 用virtualenv 来保持一个干净
  • python——常用功能之文本处理

    在生活 工作中 xff0c python一直都是一个好帮手 在python的众多功能中 xff0c 我觉得文本处理是最常用的 下面是平常使用中的一些总结 环境是python 3 3 0 基础 在python中 xff0c 使用str对象来保
  • 没有GPS模块无人机无法解锁解决方法测试及其他无法解锁APM疑难杂症

    目录 前言 xff1a 通常 xff0c APM飞控无人机组装后必须进行加速度计校准 遥控器校准 罗盘校准等 xff0c 才能解锁 但是有的APM飞控没有内置罗盘 xff0c 也没有安装外置罗盘 xff0c 在此情况下 xff0c 无法进行
  • 深度学习入门(六)——softmax函数的改良

    输出层的设计 机器学习的问题大致可以分为分类问题和回归问题 分类问题是数据属于哪一个类别的问题 比如 xff0c 区分图像中的人是男性还是女性的问题就是分类问题 而回归问题是根据某个输入预测一个 xff08 连续的 xff09 数值的问题
  • 四、FreeRTOS学习之 队列

    目录 1 定义 2 函数介绍 1 队列创建 2 队列删除 3 写队列 4 读队列 3 实例 1 定义 队列是freertos所有任务通信或同步之外的机制 xff0c 队列包含多个数据称为长度 xff0c 每个数据大小相同 xff0c 创建队
  • 静态和动态控制数码管-第1季第7部分-朱有鹏-专题视频课程

    静态和动态控制数码管 第1季第7部分 2313人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第7个课程 xff0c 全面讲解了静态数码管 无38译码器式动态数码管 有38译码器式动态数码管等各种数码管驱动方式 xff
  • MapReduce原理讲解(带源码)

    在MapReduce 中运行的job 类里 xff0c 最先出现的就是FileInputFormat 类 xff0c 它继承于InputFormat 一 InputFormat xff1a 这是一个重要的抽象类 xff0c 其中包括两个抽象