MapReduce原理全剖析

MapReduce剖析图

这里写图片描述

如上图所示是MR的运行详细过程

  1. 首先mapTask读文件是通过InputFormat(内部是调RecordReader()–>read())来一次读一行,返回K,V值。(默认是TextInputFormat,还可以输入其他的类型如:音视频,图片等。)。
  2. mapper(map(k,v))–>context.write()即mapTask阶段。
  3. 输出数据到OutputCollector收集器(不会输出一组就传到下一步进行处理,而是需要一个收集的过程,减少IO)
  4. 将收集到的数据写到环形缓冲区–>通过Spiller来将溢出的数据溢出到文件中去(在这里会通过hashPartitioner执行分区、通过key.comPareTo来实现排序(分为系统默认的快排和外部排序)即实现了shuffle的核心机制:分区和排序)。
  5. 将多个溢出文件进行Merge(采用归并排序),合并成一个大文件。
  6. 将文件下载到ReduceTask的本地磁盘工作目录–>将多个MapTask的输出结果再进行归并排序(也可以说是ReduceTask去各个mapTask对应的分区去取对应的数据)。
  7. Reducer(reduce(k,v))–>context.write(k,v)–>
    OutputFormat(RecordWriter.write(k,v))即reduceTask阶段。
  8. 将数据写到part-r-00000这里

如上图所示,图中用红色粗线描述的组件都是可以重写的。
mapreduce在编程的时候,基本上一个固化的模式,没有太多可灵活改变的地方,除了以下几处:

1、输入数据接口:InputFormat —> FileInputFormat(文件类型数据读取的通用抽象类) DBInputFormat (数据库数据读取的通用抽象类)

默认使用的实现类是 :TextInputFormat。
job.setInputFormatClass(TextInputFormat.class)
TextInputFormat的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为value返回

2、逻辑处理接口: Mapper
完全需要用户自己去实现其中 map() setup() clean()

3、map输出的结果在shuffle阶段会被partition以及sort,此处有两个接口可自定义:
Partitioner
有默认实现 HashPartitioner,逻辑是 根据key和numReduces来返回一个分区号; key.hashCode()&Integer.MAXVALUE % numReduces
通常情况下,用默认的这个HashPartitioner就可以,如果业务上有特别的需求,可以自定义Comparable
当我们用自定义的对象作为key来输出时,就必须要实现WritableComparable接口,override其中的compareTo()方法

4、reduce端的数据分组比较接口 : Groupingcomparator
reduceTask拿到输入数据(一个partition的所有数据)后,首先需要对数据进行分组,其分组的默认原则是key相同,然后对每一组kv数据调用一次reduce()方法,并且将这一组kv中的第一个kv的key作为参数传给reduce的key,将这一组数据的value的迭代器传给reduce()的values参数

5、逻辑处理接口:Reducer
完全需要用户自己去实现其中 reduce() setup() clean()

6、输出数据接口: OutputFormat —> 有一系列子类 FileOutputformat DBoutputFormat …..
默认实现类是TextOutputFormat,功能逻辑是: 将每一个KV对向目标文本文件中输出为一行

整个过程需要注意以下几点:

  • 环形缓存区(数据从outputCollector中传入环形缓存区,直到达到80%的缓存时,缓存才会启用清理机制,将已经溢出的数据溢出到文件中去(通过spiller来将数据溢出到文件中去))会溢出多次,每次溢出都会对数据进行分区排序,形成多个分区排序后的数据,最终进行合并。
  • combiner的作用:对spiller阶段的溢出数据进行一个reduce处理,直接让相同k的value值相加,减少数据量以及传输过程中的开销,大大提高效率。(根据业务需求使用,并不是每个业务都要用。可自定义一个Combiner类,内部逻辑和Reduce类似)
  • shuffle:洗牌、发牌——(核心机制:数据分区,排序,缓存
    具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;

  • 数据倾斜:指的是任务在shuffle阶段时会进行一个分区操作(默认的是hashcode取模),如果有大部分数据被分到一个ReduceTask端进行处理,一小部分任务被分到其他的ReduceTask端进行处理,就会造成其他ReduceTask处理完成后,仍有一个ReduceTask还在处理数据。最终造成整个工程延迟的情况。(为了解决这个问题,引入了Partition)

总结:

MapReduce中最核心的知识点就是MR运行的整体流程;除此之外要达到博主菜鸟级别的水平,你还需要了解以下几个知识点:
1、MapReduce是什么,用来干什么的(无论学什么首先都得知道这一点)。
2、MapReduce框架的设计思想。
3、MapReduce框架中的程序实体角色以及对应的作用:maptask reducetask mrappmaster。
(1和2详见:https://blog.csdn.net/qq_16633405/article/details/78404018)
4、MapReduce程序中maptask任务切片规划的机制。
(详见:https://blog.csdn.net/qq_16633405/article/details/79729172)
5、Yarn在MapReduce中作用。
(详见:https://blog.csdn.net/qq_16633405/article/details/79734021)
6、掌握MapReduce的编程套路,通过不断的写MR案例领悟编写MR程序的核心思想(即如何确定对应K-V值)。
(后续会将对应的MR的一些特殊套路案例上传到Git上)
目前想到的就这么点,后续有遗漏的话会接着补充。

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

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

相关文章

利用selenium webdriver点击alert提示框

在进行元素定位时常常遇到这样的alert框: 那么该如何定位并点击确定或取消按钮呢?stackoverflow上找到了这个问题的答案。 OK, Show you the code: 1 driver.findElement(By.id("updateButton")).click(); 2 //pop up w…

Log 日志的使用与重要性

开发过程中出现bug是必不可免的,你会怎样debug?从第1行代码开始看么?还是有个文件里面记录着哪里错了更方便呢!!!log日志 Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事…

webdriver 的三种等待方式

1、显式等待 一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait #…

Django的核心思想ORM

元类实现ORM 1. ORM是什么 ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。 一个句话理解就是:创建一个实例对象,用创建它的类名当做数据表名&#x…

Secondary Namenode的Check point机制以及Namenode、Datanode工作机制说明

目录前言:1、NameNode的工作机制2、DataNode的工作机制3、Secondary Namenode的Check point机制 目录 前言: 在说明checkpoint机制之前,先要了解下namenode、datanode的一些功能和职责。 1、NameNode的工作机制 问题场景: 1…

表单验证的初步实现和省市级联

1.表单验证的初步实现 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html xmlns"http://www.w3.org/1999/xhtml" lang"en"><head><meta http-equiv"Conte…

抓包软件:Charles

修正&#xff1a;手机不必一定连接电脑分享的热点&#xff0c;只需要手机和电脑在同一个局域网下就可以了&#xff0c;手机代理IP设置为电脑的IP。 之前写过一篇通过Wireshark进行抓包&#xff0c;分析网络连接的文章《通过WireShark抓取iOS联网数据实例分析》&#xff1a;htt…

Hive的相关介绍

目录前言&#xff1a;1、Hive简介2、Hive架构3、Hive与Hadoop的关系4、Hive与传统数据库对比5、Hive的数据存储总结&#xff1a; 目录 前言&#xff1a; 为什么使用Hive 直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难…

数据结构实验之排序七:选课名单

数据结构实验之排序七&#xff1a;选课名单 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 随着学校规模的扩大&#xff0c;学生人数急剧增加&#xff0c;选课名单的输出也成为一个繁重的任务&#xff0c;我校目前有在校生3万多名&#xff0…

Java第五次作业--面向对象高级特性(抽象类和接口)

一、学习要点 认真看书并查阅相关资料&#xff0c;掌握以下内容&#xff1a; 掌握抽象类的设计掌握接口的设计理解简单工厂设计模式理解抽象类和接口的区别掌握包装类的应用掌握对象的比较方法和比较器的使用学习使用日期操作类学习匿名内部类的使用二、作业要求 发布一篇随笔&…

关于国内厂商的国际版杀毒软件

很多国内软件公司的杀毒软件都分为国内版和国际版&#xff0c;这二者有什么区别呢&#xff1f; 首先&#xff0c;这两个的团队是不一样的。国际版的团队大多收购&#xff0c;国内版为自研。例如百度杀毒的国际版就是原超级巡警的团队做的&#xff0c;而国内版是自己另起炉灶。…

gulp教程之gulp-minify-css【gulp-clean-css】

原文&#xff1a;http://www.ydcss.com/archives/41 简介&#xff1a; 使用gulp-minify-css压缩css文件&#xff0c;减小文件大小&#xff0c;并给引用url添加版本号避免缓存。重要&#xff1a;gulp-minify-css已经被废弃&#xff0c;请使用gulp-clean-css&#xff0c;用法一致…

大数据面试题总结(附答案)

文章目录前言hadoop相关试题Hive相关试题Hbase相关试题Storm相关试题Spark相关试题Java基础试题其他前言 最近由于要准备面试就开始提早看些面试、笔试题。以下是自己总结的一些经常出现、有价值的试题&#xff0c;包含hadoop、hive、hbase、storm、spark等。答案仅供参考&…

win7 IE11卸载后无法上网

今天某同事需要访问一个银行网站&#xff0c;必须使用IE8,我在win7中降级IE11,直接卸载了IE11和其语言包&#xff0c;发现IE8再也打不开网页了&#xff0c;每次打开都提示保存html网页。测试Google Chrome上网完全没有问题。IE8的internet选项等任何工具菜单点击均无反应&#…

关于django的模板

模板 问题 如何向请求者返回一个漂亮的页面呢&#xff1f; 肯定需要用到html、css&#xff0c;如果想要更炫的效果还要加入js&#xff0c;问题来了&#xff0c;这么一堆字段串全都写到视图中&#xff0c;作为HttpResponse()的参数吗&#xff1f;这样定义就太麻烦了吧&#x…

Hbase简介及常用命令相关知识总结

文章目录目录前言&#xff1a;1.Hbase简介1.1、什么是Hbase1.2、与传统数据库的对比1.3、Hbase集群中的角色2、Hbase数据模型3、Hbase命令总结&#xff1a;目录 前言&#xff1a; 对于Hbase来说&#xff0c;由于其是基于列的数据库&#xff0c;所以比传统的数据库快许多&…

Django中模型类 属性-学习笔记

定义属性 Django根据属性的类型确定以下信息&#xff1a; 当前选择的数据库支持字段的类型渲染管理表单时使用的默认html控件在管理站点最低限度的验证 django会为表创建自动增长的主键列&#xff0c;每个模型只能有一个主键列&#xff0c;如果使用选项设置某属性为主键列后d…

Angular Redux

Angular Redux 转载于:https://www.cnblogs.com/skating/p/6185878.html

AtomicInteger相关类

在java6以后我们不但接触到了Lock相关的锁&#xff0c;也接触到了很多更加乐观的原子修改操作&#xff0c;也就是在修改时我们只需要保证它的那个瞬间是安全的即可&#xff0c;经过相应的包装后可以再处理对象的并发修改&#xff0c;以及并发中的ABA问题&#xff0c;本文讲述At…

Storm入门简介

目录前言&#xff1a;1、Storm简介2、Storm与Hadoop的区别3、Storm核心组件4、Storm编程模型5、流式计算一般架构图&#xff08;重要&#xff09;总结&#xff1a; 目录 前言&#xff1a; 在介绍Storm之前&#xff0c;先介绍下离线计算。 离线计算&#xff1a;批量获取数据…