从芒果分装角度—看MapReduce流程

有一芒果产销基地,园区内有芒果种植园(产), 芒果分装库(装),芒果销路(销)。
芒果种植园即HDFS中的文件,这个种植园规模很大,有不同的山头,假设一个山头一个分区。
芒果的品质不同、个头不同、成熟度不同,价格和可以销往的地点不同。
芒果产销基地需要知道不同时段芒果的品质、销售额,以对企业决策做出调整、吸引投资。

芒果季到了,用户已有预定,战斗开始了。

MapReduce流程

不同山头位于芒果分装库的四周,属于不同山头的火车从不同方向,将芒果拉到芒果分装库。

​ 现在假设a山头的一车芒果运达分装库,按照以往的经验,三个工人稳定高效地分装一车芒果。三名工人分别负责芒果车的前部、中部和后部芒果。即逻辑切片过程,并不是真的把车切开,而是一个工人负责一个区域。

​ 因为车装的量有多有少,有的前部多一点,只要不超过数据块的1.1倍,工人也不会有怨言。

​ 而如果b车装的量太少,每个工人还是处理车的一部分,那么其他车的工人干的活儿就比这个车的人多。芒果的总数是一定的,工人的总数也是一定的,活儿多的工人就会有怨言了,最后也会影响整体的工作效率。(即小文件太多的问题)

  • 小文件问题:
  • 增加map的开销,每一个分片就要执行一次map
  • 增加作业寻址时间
  • Namenode需要记录元数据,浪费Namenode内存

因为要根据芒果的品种分类,所以分装库会提前打印好不同的芒果袋。

​ 工人将芒果贴上小贴纸(就是香蕉上的那种小标签,记录了当前芒果值多少钱),即map阶段将芒果处理成想要的模式(k-v对)。然后将芒果放到框(环形缓冲区)中,框快满了的时候,就根据芒果的品类、大小等,按照顺序(快排、外部排序)放到不同的分类区,这是若出现大小品类完全一样的芒果,则先装成一块儿(conbiner)。分类区的芒果多了之后,产生很多的小堆儿,不好管理,就把同一类的放到纸箱装好(小文件merge,conbiner)。

​ map阶段和reduce阶段之间的阶段为shuffle阶段。

​ 一个切片对应一个map任务,一个分区对应一个reduce任务。

​ 我的理解是,就是将不同map阶段的输出(因为一个车分出了多种芒果嘛),发往不同的reduce处理(每个reduce只处理一种或者特定几种类型的芒果)。

不同品类的芒果,发往不同的地方。

​ reduce通过MRAppmaster获取”从哪台机器获取map输出”.MRAppmaster负责任务调度和监控,map结束会通知MRAppmaster,Reduce也会定期询问MRAppmaster以便获取map输出的位置。

​ 由于map阶段已经将芒果分好类、分区内有序。每个reduce只聚合特定种类(或者几种)的芒果。reduce就从不同的车边拿芒果箱子,放到车上运输车上,然后根据芒果标签进行计算总价格。

​ 由于reduce阶段从不同的map阶段获取芒果,map阶段内的芒果有序,但是不同map阶段之间的芒果不一定有序。所以reduce阶段要将不同map阶段获取的芒果进行一次归并排序。

  • map阶段溢写排序(快排、外部排序,根据key排)
  • 小文件合并排序(已经有序了,所以用归并排序)
  • reduce阶段从多map获取排序(归并排序)

至于为什么排序,因为一开始mapreduce是为了大数据排序而生的。

MR在reduce阶段需要分组,将key相同的放在一起进行规约,为了达到该目的,有两种算法:hash map和sort,前者太耗内存,而排序通过外排可对任意数据量分组,只要磁盘够大就行。map端排序是为了减轻reduce端排序的压力。在spark中,除了sort的方法,也提供hash map,用户可配置,毕竟sort开销太大了。

​ 感觉写着写着,芒果的浓度就不高了哈哈哈

Original: https://www.cnblogs.com/ogleede/p/16544342.html
Author: 茶倌
Title: 从芒果分装角度—看MapReduce流程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586367/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Boot动态权限变更实现的整体方案

    1、前言 ​ 在Web项目中,权限管理即权限访问控制为网站访问安全提供了保障,并且很多项目使用了Session作为缓存,结合AOP技术进行token认证和权限控制。权限控制流程大致…

    Java 2023年6月14日
    099
  • Fizz网关入门教程-权限校验

    概述 通过网关暴露的接口,必须配置路由。 权限校验是对请求接口的客户端的认证,确认其能否访问接口。 客户端可通过 fizz-appid 请求头表明身份,即表明自身是什么应用。 管理…

    Java 2023年6月9日
    077
  • mycat高可用-安全管理-监控 看这一篇就够了

    ​ 在之前的操作中,我们已经实现了mysql机器的高可用,可以动态切换master,那么如果mycat崩溃了呢?我们应该如何处理呢?所以此时就需要搭建mycat的高可用集群了。 ​…

    Java 2023年6月7日
    054
  • 03、SpringBoot 启动 执行SpringApplication的run方法 准备运行环境前 流程

    目录:Springboot源码学习目录上文:02、SpringBoot 启动 总流程前言:本篇文章开始讲;SpringBoot的启动流程的第二部分,当前第二部分是核心逻辑,也分为几…

    Java 2023年6月13日
    083
  • java追加文件

    java中,对文件进行追加内容操作的三种方法 import java.io.BufferedWriter; import java.io.FileOutputStream; imp…

    Java 2023年5月29日
    068
  • Kafka 消费者解析

    一、消费者相关概念 1.1 消费组&消费者 消费者: 消费者从订阅的主题消费消息,消费消息的偏移量保存在Kafka的名字是 __consumer_offsets的主题中 消…

    Java 2023年6月5日
    063
  • 《码处高效:Java开发手册》之代码风格

    流水淡,碧天长,鸿雁成行。编码风格,简捷清爽,反引无限风光。 在美剧《硅谷》中有这样一个经典镜头,主人公 Richard 与同为开发工程师的女友闹分手,理由是两人对缩进方式有着截然…

    Java 2023年6月5日
    066
  • Mybaits plus 数据库映射java实体三种方式

    前言 数据库一般是用下划线进行设计字段,Java实体一般用驼峰法设计属性。这是不成文的规定。当数据库字段映射java实体会出现问题。下面分别是数据库字段和实体属性。 解决问题三种方…

    Java 2023年6月8日
    083
  • webstrome注册码 时间到 2020.6.20

    AHD9079DKZ-eyJsaWNlbnNlSWQiOiJBSEQ5MDc5REtaIiwibGljZW5zZWVOYW1lIjoiSmV0IEdyb3VwcyIsImFzc2l…

    Java 2023年6月8日
    082
  • 页面滚动到指定位置——js中scrollIntoView()的用法

    element.scrollIntoView() 参数默认为true 1.什么是scrollIntoView? scrollIntoView是一个与页面(容器)滚动相关的API 2…

    Java 2023年6月8日
    075
  • OptaPlanner实用技术-批量规划和实时规划(1)

    在日常的规划应用中,无论是APS,VRP还是排班场景,有两个极其常见的需求,分别是批量规划和实时规划。下面我们对这两种情况作更深入探讨。 顾名思义,该功能是指规划程序可批量地、且行…

    Java 2023年6月16日
    072
  • CTO 说了:谁再用 Redis 过期监听实现定时任务,立马滚蛋!

    日前拜读阿牛老师的大作《领导:谁再用定时任务实现关闭订单,立马滚蛋!》发现其方案有若干瑕疵,特此抛砖引玉讨论一二。 https://juejin.cn/post/698723326…

    Java 2023年6月15日
    065
  • Java9的模块化是什么

    Java9中的一个重大特性是增加了一种新型的程序设计组件 – 模块。 官方对模块的定义为:一个被命名的,代码和数据的自描述集合。( the module, which …

    Java 2023年6月7日
    077
  • vue项目启动报错 Error: spawn cmd ENOENT

    一、yarn serve 启动vue项目,如下报错: `html;gutter:true;Type checking in progress… App running …

    Java 2023年6月15日
    0102
  • 设计模式二:webMVC

    model:观察者模式,对view和controller一无所知,即完全decouple。仅知道有observer需要它去通知 view:组合模式实现的jsp等用户界面。当发生页面…

    Java 2023年6月9日
    061
  • 引入Elasticsearch7.x版本后,原本好好的服务无法启动了

    问题背景 项目上使用的springboot版本是 2.1.1.RELEASE,现在因为要接入elasticsearch7.x版本,参考官方文档要求,需要将springboot版本升…

    Java 2023年6月6日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球