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. GooFlow

    目前的下载网址:基于JQUERY的WEB在线流程图设计器GOOFLOW 0.7版

  2. Android 造炫目的圆形菜单 秒秒钟高仿建行圆形菜单

    1.概述 今天打开建行看存款,一看伤心欲绝,再看:我擦,这个圆形菜单挺炫.于是,为了掩盖我悲痛的心情,我决定是实现这个效果.好了,其实还有个原因,记得我初学android那会我做的应用被鄙视了,说我的 ...

  3. HDU 5249:KPI(权值线段树)

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  4. R_Studio(癌症)以等宽类别值、自定义类别值、等频类别值(分为5类)

    对“癌症.csv”中的肾细胞癌组织内微血管数进行连续属性的离散化处理 增加“微血管数分类1”属性,取值为等宽类别值(分为5类),增加“微血管数分类2”属性,取值为自定义类别值(0~40,41~60,6 ...

  5. Redis的一点笔记

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 优势: 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富 ...

  6. hive 分组排序函数 row_number() over(partition by " " order by " "desc

    语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...

  7. Spring-data-redis 第一天

    1.Redis 这就不必哆嗦了,Redis 支持丰富的数据类型,String ,List,Sets ,Sorted Sets,Hashes,这就可以看出Java 操作Redis就要针对各种类型都有自己 ...

  8. STS热部署方法(springboot)

    sts热部署,即是在项目中修改代码不用重新启动服务,提高效率.   方法如下: 1.在pom文件中引入  devtools  依赖: <dependency> <groupId> ...

  9. C++入门经典-例2.10-控制输出精确度

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

  10. java栈和队列

    栈    可变长数组实现    链表实现    数组与链表的对比队列    链表实现 栈 下压栈(简称栈)是一种基于后进后出(LIFO)策略的集合类型.这里学习分别用数组和链表这两种基础数据结构来实现 ...