MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题
MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算。
两个函数的形参是key、value对,表示函数的输入信息

解释:一个文件按照块(每块给定具体值)分为多个split,每个split对应一个mapper,然后通过shuffle进行分组(把相同的key的value合并),最后交给reduce进行最终的合并计算 输出为part-00000名字的文件
Mappers must compiete before Reducers can begin
map必须完成后才可开始reduces工作
每一个步骤都是通过键值对的形式输入输出。
执行步骤:
 1.map任务处理
  • 读取输入文件内容,解析成key、value对,对输入文件的每一行,解析成key,value对,每一个键值对调用一次map函数
  • 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
  • 对输出的key、value进行分区。
  • 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
  • (可选)分组后的数据进行归约的
2.reduce任务处理
  • 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
  • 对多个map任务的输出镜像合并、排序,写reduce函数自己的逻辑,对输入的key、value处理。转换成新的key、value输出。
  • 把reduce的输出保存到文件中
 
自我理解:
[k1,v1]    Map   [k2,v2]   Group [k2,{v2...}]   Reduce   [k3,v3]
系统自动按照一行内容分解成多个k1,v1。
在Map过程内根据自己的业务逻辑需求 输出k2,v2
系统自动对k2进行分组计算 输出 k2,{v2...}
在Reduce内根据业务逻辑到处k3,v3
 

1、Partiton的原理及使用方法(分区)
    在MapReduce进行计算时,有时需要把最终输出数据分到不同的文件中,例如:按照省份划分,需要把同一省份的数据放到一个文件中,从而得到多个文件。(得到几个文件,就需要几个Reducer任务运行)也就是说Mapper任务要划分数据,对于不同的数据分配给不同的Reducer任务运行。Mapper任务划分数据的过程就称作Partition,负责实现划分数据的类称作Partitioner。
    partition是分割map每个节点的结果,按照key(k2)分别映射给不同的reduce,也是可以自定义的,这里其实可以理解成归类。
原理及作用
hadoop采用的默认的派发方式时根据散列来派发的,但是实际中,这并不能很高效或者按照我们要求的去执行任务。
    例:我们想要处理后得到的文件按照一定的规律进行输出,假设有两个reducer,我们想要的最终结果中part-r-00000中存储的是“h”开头的记录的结果,part-r-00001中存储其他开头的结果,这些默认的partitioner是做不到的。
 
默认分区源码:
 public class HashPartitioner<K, V> extends Partitioner<K, V> {
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
(1)Partitioner是HashPartitioner的基类,如果需要定制partitioner也需要继承该类。
 (2)HashPartitioner是mapreduce的默认partitioner。计算方法是       key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到当前的目的reducer。
numReduceTasks由mapred.reduce.tasks配置节点决定的默认是1。
那现在我们虽然不知道(key.hashCode() & Integer.MAX_VALUE)值是多少但是%1我们可以知道结果就是0
 
使用方法
    map的结果,会通过partition分发到Reducer上,哪个可以到哪个Reducer的分配过程,是由Partition规定的、
  
  getPartition(Text key,Text value,int numPartitions)
 
 
三个参数分别是k2/v2/reducers的个数
 
自定义分区的使用方法
 

2、Combiner的原理及使用方法

每个map可能会产生大量的输出,combiner的作用就是在map端 对输出先做一次合并,以减少传输到reducer的数据量。
    如果不用combiner,那么所有的结果都是reduce完成,效率会相对低下,使用combiner,先完成的map会在本地聚合,从而提升速度
注意
combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果,所有Combiner只应该用于那种Reduce的输入key/value对输出key、value类型完全一致,且不影响最终结果的场景。如:求平均值等等,不能光说数据类型一致,有可能值会改变需要特别注意
原理及使用方法
Combiner在map端进行的一个reduce阶段如wordCount程序通过combiners就可以进行预先的聚合

这样到reduce就不会每个节点的每个单词输出以便,减少数据流量并减少代销,由于在wordCount中做combiners是跟reduce一样的,可以直接使用reduce类进行combiners
job.setCombinerClass(ReduerClass.class);
 
 
3、shuffle的工作原理
 

map和reduce本身各是一台机器且也分别是一个步骤
shuffle只是一个工作步骤,横跨map reduce两台机器的工作步骤
 
map端中的shuffle
首先把一个文件通过hdfs配置文件(默认一块128m)分割成文件块(block),然后进入map,一条一条输出数据,首先输出到缓冲中,(当数据达到缓冲的80%就会溢出到磁盘中),在溢出(spill)时会进行分区(partition)和排序(sort) 合并(merge)然后溢出到磁盘
分区:如果进行分区则会分成3块文件,每块文件就会对应一个reduce
注:物理分区不在缓冲区,而是在磁盘上
        最终文件只有一个,所以需要合并(merge),如果有combiner则会进行一次计算
        缓冲区默认值100Mb
Reduce端的shuffle
首先将map端产生的输出文件拷贝到Reduce端
然后再次合并给到Reduce计算。输出
 
 
4、Hadoop的压缩codec
hadoop中支持的压缩方式有多种,如:Gzip、bzip2、LZO等,其中Gzip是hadoop中内置支持的一种压缩方式,压缩比比较高,压缩速度也不错
MapReduce的输出进行压缩
 

 
 

小记---------Hadoop的MapReduce基础知识的更多相关文章

  1. hadoop学习笔记——基础知识及安装

    1.核心 HDFS  分布式文件系统    主从结构,一个namenoe和多个datanode, 分别对应独立的物理机器 1) NameNode是主服务器,管理文件系统的命名空间和客户端对文件的访问操 ...

  2. MapReduce基础知识

    hadoop版本:1.1.2 一.Mapper类的结构 Mapper类是Job.setInputFormatClass()方法的默认值,Mapper类将输入的键值对原封不动地输出. org.apach ...

  3. hadoop入门必备基础知识

    1.对Linux 系统的要求        会基本的命令:        (1)知道root用户        (2)ls命令会查看文件夹内容        (3)cd命令等2.Java 的要求    ...

  4. 【大数据】了解Hadoop框架的基础知识

    介绍 此Refcard提供了Apache Hadoop,这是最流行的软件框架,可使用简单的高级编程模型实现大型数据集的分布式存储和处理.我们将介绍Hadoop最重要的概念,描述其架构,指导您如何开始使 ...

  5. 大数据和hadoop的一些基础知识

    一.前言 大数据这个概念不用我提大家也听过很多了,前几年各种公开论坛.会议等场合言必及大数据,说出来显得很时髦似的.有意思的是最近拥有这个待遇的名词是“人工智能/AI”,当然这是后话. 众所周知,大数 ...

  6. Hadoop系列-MapReduce基础

    由于在学习过程中对MapReduce有很大的困惑,所以这篇文章主要是针对MR的运行机制进行理解记录,主要结合网上几篇博客以及视频的讲解内容进行一个知识的梳理. MapReduce on Yarn运行原 ...

  7. [Hadoop in Action] 第4章 编写MapReduce基础程序

    基于hadoop的专利数据处理示例 MapReduce程序框架 用于计数统计的MapReduce基础程序 支持用脚本语言编写MapReduce程序的hadoop流式API 用于提升性能的Combine ...

  8. Hadoop 综合揭秘——MapReduce 基础编程(介绍 Combine、Partitioner、WritableComparable、WritableComparator 使用方式)

    前言 本文主要介绍 MapReduce 的原理及开发,讲解如何利用 Combine.Partitioner.WritableComparator等组件对数据进行排序筛选聚合分组的功能.由于文章是针对开 ...

  9. 零基础学习hadoop开发所必须具体的三个基础知识

    大数据hadoop无疑是当前互联网领域受关注热度最高的词之一,大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变.这种改变给我们的感觉是“水到渠成”,更为让人惊叹的是大数据已经仅仅是互联网 ...

随机推荐

  1. 2019春Python程序设计练习5(0416--0422)

    6-1 6-1.使用函数求特殊a串数列和 (30 分)   给定两个均不超过9的正整数a和n,要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和 函数 ...

  2. MFC:OnCreate PreCreateWindow PreSubclassWindow

    OnCreate PreCreateWindow PreSubclassWindow PreCreateWindow和PreSubclassWindow是虚函数,而OnCreate是一个消息响应函数. ...

  3. CSS3 文字渐变动画

    背景剪裁 语法:background-clip: border-box || padding-box || context-box || no-clip || text 本次用到的就是: -webki ...

  4. 计算机网络(六),UDP报文段详解

    目录 1.UDP作用 2.UDP报文段详解 六.UDP报文段详解 1.UDP作用 (1)面向非连接 (2)不维护连接状态,支持同时向多个客户端传送相同的消息 (3)报文段报头只有8个字节,格外开销较小 ...

  5. 51 Nod 1556计算(默慈金数的应用)

    #include<bits/stdc++.h> #define mod 1000000007 using namespace std; typedef long long ll; ll m ...

  6. python3 使用装饰器,及函数作为参数

    #装饰import typesdef shucai(n): print('蔬菜价格7') if type(n)==types.FunctionType: return n()+7 return n+7 ...

  7. C++入门经典-例4.9-输出不同生命周期的变量值

    1:代码如下: // 4.9.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using ...

  8. LeetCode 55. 跳跃游戏(Jump Game)

    题目描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

  9. navicat常用快捷键与SQL基本使用

    一.Navicat常用快捷键 1,Ctrl+q就会弹出一个sql输入窗口 2,Ctrl+r就执行sql了 3,按f6会弹出一个命令窗口 4,Ctrl+/ 注释 5,Ctrl +Shift+/ 解除注释 ...

  10. leetcode172 阶乘后的零

    对数算法:O(nlogn) /** 即为统计0-n中5,10,15,20,25的个数,因为肯定有足够的偶数使得存在x*5=10*n,25=5*5因此计数加2,5=1*5计数加一: 但如果挨个计数当n很 ...