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. pdf转换

    namespace Utilities { public static class PDFHelper { /// <summary> /// Html转Pdf /// </summ ...

  2. 在linux 下安装nginx

    1.编译安装Nginx 官网:http://wiki.nginx.org/Install 下载 # wget http://nginx.org/download/nginx-1.8.0.tar.gz ...

  3. Python天天学_01_基础1

    Python_day_01 金角大王:http://www.cnblogs.com/alex3714/articles/5465198.html ------Python是一个优雅的大姐姐 学习方式: ...

  4. 51 Nod 1134 最长递增子序列(经典问题回顾)

    1134 最长递增子序列  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元 ...

  5. THUSC2016 成绩单

    题目链接:Click here Solution: 我们设\(f[l][r][x][y]\)表示在原区间\(l\sim r\) 内还未被取走的值最大为\(x\)最小为\(y\)时的代价,这里我们只考虑 ...

  6. Android 一般动画animation和属性动画animator

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  7. Jmeter(二) Jmeter组件介绍

    一.测试计划 测试的起点,同时也是其他所有组件的容器 二.线程(用户) Setup 线程组:一种特殊类型的线程,可用于执行预测试操作.即执行测试前进行定期线程组的执行 Teardown 线程组:一种特 ...

  8. VMware Guest customization fails on Linux

    1.1  症状现象 登录Guest OS,在/var/log/vmware-imc/toolsDeployPkg.log文件中,您会看到以下条目: Customization command fail ...

  9. sessionStorge和localStorage的使用-踩坑记_09

    sessionStorge的使用 sessionStorage 属性允许你访问一个 session Storage 对象.它与 localStorage 相似,不同之处在于 localStorage ...

  10. Eclipse的JSON文件报错解决

    有时候我们后端老哥不想写HTML,偷懒去下载个前端页面,结果里面的JSON文件老报错 虽然可以正常运行,但红X看起来就是不爽,怎么解决呢 这是因为Eclipse认为JSON文件不需要注释,所以报的编译 ...