IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mapreduce流程 -> 正文阅读

[大数据]mapreduce流程

mapreduce的整体流程

  • 输入

  • 输入文件会被切分成多个切片,每一个切片交给一个map task进程来读取,默认每个block对应一个切片。

  • 默认的Textinputformat以行为单位进行读取,每行数据返回一个键值对,将行号为key,行文本作为value,交给map函数处理。
    因为如果一个切片包含了多个block,会存在maptask读取数据跨网络传输,不利于数据本地化的实现。

  • map

  • 在每个maptask中,有一个map函数,基于每行数据得到的键值对进行处理,得到新的键值对,通过context.write方法会将k2 v2写入到环形缓冲区中。

  • 有多少个key-value对,就调用多少次Map函数。

  • shuffle阶段

  • 我们知道,每个maptask会将map阶段输出数据写入本机的环形缓冲区中,环形缓冲区中的数据进行溢写 排序 合并等操作形成临时文件传输给reduce端,最终交给reduce函数来处理。

  • shuffle阶段整体分为分区 排序 规约 分组 四个步骤,但是每个步骤并不是单独进行的。

  • 分区
    将一个maptask的数据分成多个分区,每个分区对应一个reducetask。
    对于自定义分区操作,会为每一个key生成一个分区编号,在排序的时候会先按照分区编号排序,再按照key排序,从而完成了分区的逻辑。

  • 排序
    每一个maptask中的同一个分区的数据会按照map阶段输出的key进行排序。可以通过重写比较器自定义排序。
    排序的过程是分阶段进行的,在溢写之前,map端合并,reduce端合并的过程中都会进行排序。

  • 规约
    对数据进行局部汇总,减少网络数据传输,提高效率。(规约要符合业务要求,求和可以规约,求平均值不可以)
    由于规约是基于map端所有数据进行局部汇总的,因为也是分多个阶段完成的,在溢写之前,map端合并,reduce端合并的过程中都会进行规约。

  • 传输
    maptask与reducetask之间有一个数据分发过程,每个maptask的各分区数据会发送到各自对应的reducetask端。
    实际过程是reduce端主动从map端拉取数据,先放在缓存中,逐步溢写 合并 得到临时文件。

  • 分组
    分组的过程在reducetask端完成,每个reducetask将接收到的当前分区的数据进行分组
    相同 Key 的 Value 放入一个集合中组成新的集合形式的value。
    因为在分组前一个分区内部的key已经排好序了,所以实现时依次比较相邻各个key,相同就放在一个分组,下一个key不同就另起一个分组。

  • reduce阶段
    基于分组得到的每个key和对应value集合,进行聚合逻辑,最终得到新的键值对
    然后通过context.write方法将键值对写入到hdfs文件中

  • 输出阶段
    TextOutputFormat类将每一个k4-v4对作为一行进行输出,默认一个分区写一个文件
    mapreduce整体流程图解 三个maptask,两个reducetask

  • 如下是mapreduce整体流程的图示
    maptask
    在这里插入图片描述
    reducetask
    在这里插入图片描述

shuffle阶段详细流程

  • 首先,map端通过context.write方法输出的数据存放在环形缓冲区中,一个maptask对应一个环形缓冲区。
  • 环形缓冲区的容量很有限,不可能容纳所有数据,因此会进行溢写操作(在溢写前在缓冲区中用快排对数据进行排序),得到一个个按照分区编号和key排序的小文件,从全局的角度来看相当于完成了局部排序。
  • 然后各个小文件进行合并,在合并过程中进行归并排序,得到一个按照分区编号和key排序的临时文件,供reduce来拉取。
  • reducetask会到各个maptask端拉取属于自己分区的文件,当有部分maptask执行成功了就开始逐步去拉取数据。reduce拉取数据时同样先缓存到缓冲区,再逐步溢写成文件,将溢写的文件合并在合并过程中进行归并排序,得到一整个分区且内部有序的文件,在分组时由于相同的key相邻可以直接两两判断将相同key的所有value组成一个迭代集合发送给reduce(key3,iterator)函数执行。
  • 然后调用reduce函数,每一个key对应的分组触发一次reduce函数执行,最终将reduce输出的结果写入到hdfs中,一个分区输出一个文件。
  • 整个shuffle过程中,分区和排序是经过三个阶段才完成的。另外,如果设置了规约,在排序的过程中会顺便完成规约操作,如果相邻两个key相同完全可以进行局部汇总。
  • 至于为什么要使用归并排序,是因为溢写的小文件已经局部有序了,要充分利用局部有序性,另外归并排序不需要将所有数据加载到内存中,只需要很小缓冲区就可以做到,自行脑补一下归并的过程就明白了。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:46:21  更:2021-08-18 12:47:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:22:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码