简单介绍

官方给出的介绍是hadoop MR是一个用于轻松编写以一种可靠的、容错的方式在商业化硬件上的大型集群上并行处理大量数据的应用程序的软件框架。

MR任务通常会先把输入的数据集切分成独立的块(可以看成是一个较小数据集),然后这些块由map任务以完全并行的方式的去处理。map任务输出的结果排完序之后会交给reduce去处理得到最终结果。MR负责调度,监听并重新执行失败的任务,它的输入和输入都存储在hdfs上。

MR框架由一个主节点 ResourceManager, 一个或多个从节点 NodeManager以及每个应用程序独有的 MRAppMaster 组成。通常而言, MR 框架和hdfs运行在一组相同的的节点,即执行计算任务和负责数据存储的节点是同一个,这样的配置允许MR能够在存在数据的节点上高效地调度任务。

对于MR程序的开发,开发者只需要指定输入输出路径,通过实现适当的接口、抽象类以及一些其他的任务参数便可以完成。

任务流程

这里以MR的inputs-outputs、map、reducet三个方面来深入了解MR任务流程。

Inputs-outputs

MR框架仅操作<key, value> 形式的键值对,即MR把输入的数据视为一组<key, value>,并输出一组<key, value>。值得一提的是输入和输出的<key, value>在数据类型上并没有任何联系。

MR处理数据的核心思想是移动计算而不是移动数据,有些类似于就近原则,即哪个节点有数据,计算任务就在哪个节点执行,这和把数据全移动到同一节点计算相比,效率要高很多。所以一个MR job的执行首先要做的就是把需要执行的计算程序copy一份,然后传输到有数据的节点,因此MR操作的对象<key, value>必须能被MR序列化,也就需要实现 Writable 接口,同时由于MR会对输出的<key, value> 排序,所以也必须实现 WritableComparable 接口。

inputs-outputs在MR中位置如下:

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)。

input

MR的输入依靠InputFormat实现,InputFormat为MR任务实现了以下三点:

  1. 验证任务的输入规格。
  2. 将输入的文件切分成逻辑切片(InputSplit),并将之分配给mapper任务
  3. 提供了RecordReader从InputSplit上读取数据供mapper处理

默认的输入格式( InputFormat)是TextInputFormat

output

MR的输入依靠OutputFormat实现,OutputFormat为MR任务实现了以下两点:

  1. 验证任务的输出规格,如文件路径是否已存在
  2. 提供RecordWriter将输出写入文件系统。

默认的输出格式是TextOutputFormat。

Mapper

对于InputFormat产生的每一个InputSplit,MR框架都会启动一个map任务,该任务会把RecordReader 传来的<key, value> 映射成一组中间值(即一组新的<key, value> )。值得注意的是中间值的数据类型和输入的数据类型是不需要一致的,而且一个给定的<key, value> 对会可能被映射成0个或者多个中间值。

mapper的实现是通过 Job.setMapperClass(Class)方法传递给job的,然后MR调用map(WritableComparable, Writable, Context) 方法处理输入的<key, value>对,输出的结果通过调用context.write(WritableComparable, Writable)方法汇总。

在map阶段,启动的map的数量通常是由输入文件的大小所决定,即是输入文件的block的总数。也可以通过Configuration.set(MRJobConfig.NUM_MAPS, int)手动设置。

map输出的中间值会调用OutpCollector.collect(key,value),在该方法内部,先调用Partitioner.getPartition()(通过job.setPartitionerClass(class)控制,每一个分区对应一个reducer)获取该记录的分区号,然后将<key,value,partition>传给MapOutputBuffer.collect(), MapOutputBuffer内部使用了一个内部的环形的缓冲区来暂时保存用户的输出数据,当缓冲区使用率达到一定阀值后,由SpillThread线程将缓冲区中的数据spill到本地磁盘上(在此阶段会先对partition分区号排序,然后再按照key排序(通过Job.setSortComparatorClass(Class)控制,若没有设置,则默认调用key内部实现的compareTo方法),然后会把数据写入文件到临时目录(若有设置combiner,写入文件之前会对分区数据做聚集操作,生成key和value的集合组成的键值对)并把元数据写入SpillRecord)。【详细见参考3】

我们还可以通过Job.setCombinerClass(Class)指定一个combiner来对map数据在本地进行聚合操作,这样做可以减少从mapper传输到reducer的数据量。

Reducer

reducer的主要负责将同一个key所对应的value值合并。而reduce任务的个数可以由 Job.setNumReduceTasks(int)设置。

reducer的实现是通过Job.setReducerClass(Class) 传递给job的,然后MR框架会调用 reduce(WritableComparable, Iterable<Writable>, Context)方法方法处理分组输入的每个key及其所对应的value的集合所组成的<key, value>对。

Reducer 主要分为三个阶段: shuffle, sort 以及 reduce.

shuffle

在这个阶段,MR框架会通过HTTP从各个mapper所在节点获取与本地reduce任务相关的分区的数据

sort

在此阶段,MR会对从各个节点获取的数据通过key进行分组(调Job.setSortComparatorClass(Class)指定的Comparator,此处的数据对象是从各个mapper汇集过来的输出数据,在map阶段处理的是当前的一个map的数据)

Secondary Sort

此阶段(若有)会调用 Job.setGroupingComparatorClass(Class)指定的分组函数类对数据分组(决定了哪些key可以分为一组无论是否相同)生成key对应的value迭代器,这个迭代器的key使用属于同一个组的所有key的第一个key。

reduce

本阶段会调用reduce(WritableComparable, Iterable<Writable>, Context) 处理传过来的每一个<key, (list of values)>并通过Context.write(WritableComparable, Writable)写入 FileSystem (文件系统)。

与map不同,reduce的输出结果是无序的。

参考:

https://insight.io/github.com/apache/hadoop/blob/trunk/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/Job.java

http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

http://flyingdutchman.iteye.com/blog/1878775

hadoop MapReduce的更多相关文章

  1. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  2. hadoop MapReduce Yarn运行机制

    原 Hadoop MapReduce 框架的问题 原hadoop的MapReduce框架图 从上图中可以清楚的看出原 MapReduce 程序的流程及设计思路: 首先用户程序 (JobClient) ...

  3. Hadoop Mapreduce分区、分组、二次排序过程详解[转]

    原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2) ...

  4. Hadoop MapReduce编程 API入门系列之薪水统计(三十一)

    不多说,直接上代码. 代码 package zhouls.bigdata.myMapReduce.SalaryCount; import java.io.IOException; import jav ...

  5. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  6. Hadoop MapReduce例子-新版API多表连接Join之模仿订单配货

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 一.    项目简介: 电子商务的发展以及电商平台的多样化,类似于京东和天猫这种拥有过亿用户的在线购 ...

  7. Writing an Hadoop MapReduce Program in Python

    In this tutorial I will describe how to write a simpleMapReduce program for Hadoop in thePython prog ...

  8. Hadoop MapReduce编程学习

    一直在搞spark,也没时间弄hadoop,不过Hadoop基本的编程我觉得我还是要会吧,看到一篇不错的文章,不过应该应用于hadoop2.0以前,因为代码中有  conf.set("map ...

  9. Hadoop MapReduce概念学习系列之mr程序组件全貌(二十)

    其实啊,spilt是,控制Apache Hadoop Mapreduce的map并发任务数,详细见http://www.cnblogs.com/zlslch/p/5713652.html map,是m ...

  10. 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...

随机推荐

  1. array_diff()

    array_diff()函数定义和用法 array_diff() 函数返回两个数组的差集数组.该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键值. 在返回的数组中,键名保持不变. 提示 ...

  2. Rhino学习教程——1.1

    在Rhino的官网下载好Rhino5.0版本后(Rhino官网会提供下载方式,官网是http://www.xuexiniu.com),双击桌面快捷键,就会出现Rhino的界面(我已经自定义过界面了). ...

  3. 强大的金融类图表库 TradingView 使用分享

    这段时间刚好做币圈交易所,运用到了现在最火的金融类图表库 -- TradingView ,就是强大,基本上现在的火币网(https://www.huobi.com),币安网(https://www.b ...

  4. java读取各种类型文件

    用到的几个包 bcmail-jdk14-132.jar/bcprov-jdk14-132.jar/checkstyle-all-4.2.jar/FontBox-0.1.0-dev.jar/lucene ...

  5. Buzzsumo大型教程(内容营销+外链outreach必备)营销神器

    做内容营销,Buzzsumo基本是必备工具.做谷歌白帽SEO的百分八十应该都用过或者至少接触过.在国外就更不用说了,很多网络营销大牛眼里,Buzzsumo的重要程度绝对超过Ahrefs! Buzzsu ...

  6. Android 偏门xml属性

    在 recycleView listview scroview 等等 活动的时候会出现蓝边 android:overScrollMode="never" 用次属性可以去掉 fadi ...

  7. Intellij IDEA xxx.properties变成纯文本模式解决方案

    今天在创建xxx.properties的时候不知道按到了哪里,结果让它编程了纯文本模式,重命名这个文件或者删掉,重新创建这个同名文件,换一个项目,始终是文本文件类型,就估计不是项目问题,是intell ...

  8. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

  9. waitGroup的使用

    package main import ( "fmt" "sync" "time" ) func main() { var wg sync. ...

  10. Linux "ls -l"文件列表权限详解 【转】

    1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- 2 root              adm    4096 2013-08-07 11:03 apache2 ...