Hadoop 学习笔记二 --- 计算模型MapReduce

       MapReduce 是一个计算模型,也是一个处理和生成超大数据集的算法模型的相关实现。用户首先创建一个Map函数处理一个基于Key/Value pair 的数据集合,输出中间的基于Key/Value pair的数据集合,然后再创建一个Reduce 函数用来合并所有的具有相同中间Key值的中间Value值。其最主要的两个部分就是Map过程和Reduce过程。

一. Map 处理过程

1. Mapper 类的处理原理

       Mapper 类的最主要的功能就是将输入的Key/Value pair 通过自己Map函数的处理,得到符合要求的Kay/Value pair。在前面分析Hadoop作业的输入的时候,MapReduce框架会为作业分割后的每一个Split分片都分配一个Mapper处理函数。

         Mapper 的输入是通过InputSplit 的函数createRecordReader 创建的一个LineRecordReader 行记录读取器,该读取器针对输入分片Split 进行读取,每次读取一行,得到以偏移量为Key,行的内容为Value的Key/value pair 传给Mapper。

       Mapper的输出Key/Value pair 是按照Key来分组的,使得具有相同Key的Key/Value 键值对放在一起,然后将他们分发给相同的Reducer。用户可以通过指定特定的RawComparator实现类来控制分组过程的执行。此外,用户也可以通过指定Partitioner实现类来控制Mapper的输出被分发给哪个具体的Reducer进行处理。

      由于一般情况下,Mapper和Reducer都会分布在不同的主机上面,Mapper和Reducer之间的K-V 对的传递是依据http协议 通过网络传递的。为了减少数据在网络上传输量,一般会在Mapper端使用combiner实现类对数据进行处理。使用Reducer在Mapper端对Mapper的输出结果进行本地的聚集处理,从而减少了发送给Reducer的数据量。

2. Mapper类的源码分析

Mapper 类主要有五个方法:

protected void setup(Context context)//默认是空方法,在Mapper任务开始的时候会被调用一次。

protected void cleanup(Context context)//默认是空方法,在Mapper任务结束的时候会被调用一次。

protected void map(KEYIN key, VALUEIN value,  Context context) throws IOException, InterruptedException {
    context.write((KEYOUT) key, (VALUEOUT) value);
  }//map函数,一般我们自定义的Mapper只会覆盖map函数来完成对Key/Value的处理

public void run(Context context) throws IOException, InterruptedException {  
    setup(context);//初始化
    try {
      while (context.nextKeyValue()) {//每次读取一行,得到相应的K-V 对
        map(context.getCurrentKey(), context.getCurrentValue(), context);//对该K-V对进行map处理
      }
    } finally {
      cleanup(context);//结束处理
    }
  }//该方法会在Hadoop运行mapper任务的时候自动被调用,我们可以覆写该方法得到一些更高级的操作

public Context()//一个Context类,该类只是继承了MapContext类,没有任何新方法。

Hadoop还为我们提供了若干个针对不同情况的Maooer实现子类,这里就不一一介绍了。

 

二. Reducer 处理过程

1. Reducer 概述

       Reducer 的主要作用就是将Mapper 的输出结果中具有相同key的键值对进行进一步的reduce(规约),产生数量更少的键值对。Reducer 的数量可以通过Job 的setNumReduceTask 方法进行设置。Reducer 主要包括以下三个阶段:

a. Shuffle 阶段:利用Http 协议将所有Mapper的输出中与该Reducer 相关的数据复制到Reducer 主机上。

b. Sort 阶段:将来自不同的Mapper 的具有相同Key 的输出Key/Value 键值对按照Key进行排序

c. Reduce 阶段:为已经分好组的Key/list(Value) 调用一次Reduce方法,进行规约。

2. Reducer 源码分析

Reducer 的源码和Mapper 的源码差不多,功能也差不多。

protected void setup(Context context)//默认是空方法,在Reducer任务开始的时候会被调用一次。

protected void cleanup(Context context)//默认是空方法,在Reducer任务结束的时候会被调用一次。

protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context) throws IOException, InterruptedException {

for(VALUEIN value: values) {
      context.write((KEYOUT) key, (VALUEOUT) value);

  }//map函数,一般我们自定义的Reducer只会覆盖reduce函数来完成对Key/Value的处理

public void run(Context context) throws IOException, InterruptedException {  
    setup(context);//初始化
    try {
      while (context.nextKey()) {//每次读取一行,得到相应的K值
        reduce(context.getCurrentKey(), context.getCurrentValue(), context);//对该K-V对进行reduce处理
      }
    } finally {
      cleanup(context);//结束处理
    }
  }//该方法会在Hadoop运行Reducer任务的时候自动被调用,我们可以覆写该方法得到一些更高级的操作

public Context()//一个Context类,该类只是继承了ReduceContext类,没有任何新方法。

三. Partitioner 分区处理过程

        Partitioner 分区处理过程在Mapper之后,Reducer之前执行。它主要的功能就是把Mapper输出的中间结果按照key分发给不同的Redcuer 任务进行处理。要保证Hadoop的负载均衡,Partitioner需要满足两个条件:平均分布和高效。

      Partitioner 类是一个抽象类,其只有一个抽象函数:

public abstract int getPartition(KEY key, VALUE value, int numPartitions);//根据给定的键值对和分区的总数量(一般为Reduce任务的数量),返回该键值对所对应的分区号。

      HashPartitioner 是Partitioner 的默认实现类,该类会使用Hash函数来对Mapper的输出进行分区处理:

public abstract int getPartition(KEY key, VALUE value, int numPartitions) {

        return (key.hashCode() & Integer.MAX_VALUE) % numReduceTask;

}

时间: 2024-10-21 17:23:39

Hadoop 学习笔记二 --- 计算模型MapReduce的相关文章

hadoop学习笔记(二)

hadoop学习笔记(二) 我的个人博客站点地址:孙星的个人博客主页 后续的学习笔记:hadoop学习笔记 hadoop单节点的搭建 下载hadoop: wget http://apache.fayea.com/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz tar -zxvf hadoop-2.7.1.tar.gz 解压配置免密码登陆: //生成秘钥 ssh-keygen -t rsa //一直回车,在当前目录中会出现2个文件,一个是公钥,一个是私

Hadoop-HBASE案例分析-Hadoop学习笔记&lt;二&gt;

之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第八章的笔记 主要介绍HBase,一个分布式数据库的应用案例. 案例概况: 1)时间序列数据库(OpenTSDB) 用HBase储存时间序列数据,每时每刻都在解决,数据库为开源 2)HBase爬虫调度库 垂直搜索爬虫 大规模爬虫(全网爬虫) 这里界定URL爬虫调度 3)HBase文档库 储存文档数据库,偏重于储存 4)银行人民币查询系统 不在博客园上阅读时才会看到的,这篇博文归http://www.cnbl

hadoop学习笔记(二)——hadoop思想简介

这几天阅读<hadoop实战>,初步了解了一下hadoop的核心思想,简要的比较如下: 1.  hadoop是一个开源框架,可编写和运行分布式应用处理大数据,具有方便.简单.健壮性.可扩展性等优点 2.  MapReduce程序的执行分为两个阶段,为mapping和reducing.每个阶段均定义为数据处理函数,分别被称为mapper和reducer.在mapping阶段,MapReduce获取输入数据并将数据单元装入mapper:在reducing阶段,reducer处理来自mapper的所

hadoop 学习笔记:mapreduce框架详解

hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

Hadoop学习笔记(二)——zookeeper使用和分析

分布式架构是中心化的设计,就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.Zookeeper就是一套分布式锁管理系统,用于高可靠的维护元数据. 一.应用 1.集群模式 集群模式下配置多个Zookeeper节点,启动Zookeeper集群,Zookeeper会根据配置投票选举一个节点获得分布式锁. 关键配置举例: # The Cluster servers #server.1=192.168.1.10:2887:3887 #serv

马哥学习笔记二十一——LVS DR模型

kernel parameter: arp_ignore: 定义接收到ARP请求时的响应级别: 0:只要本地配置的有相应地址,就给予响应: 1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应: arp_announce:定义将自己地址向外通告时的通告级别: 0:将本地任何接口上的任何地址向外通告: 1:试图仅向目标网络通告与其网络匹配的地址: 2:仅向与本地接口上地址匹配的网络进行通告: curl命令选项: --cacert <file> CA证书 (SSL) --capath &l

Hadoop学习笔记(二)设置单节点集群

本文描述如何设置一个单一节点的 Hadoop 安装,以便您可以快速执行简单的操作,使用 Hadoop MapReduce 和 Hadoop 分布式文件系统 (HDFS). 参考官方文档:Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Hadoop版本:Apache Hadoop 2.5.1 系统版本:CentOS 6.5,内核(uname -r):2.6.32-431.el6.x86_64 系统必备组件 支

Hadoop学习笔记(4) ——搭建开发环境及编写Hello World

Hadoop学习笔记(4) ——搭建开发环境及编写Hello World 整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclipse方便. 下载 进入官网:http://eclipse.org/downloads/. 找到相应的版本进行下载,我这里用的是eclipse-SDK-3.7.1-linux-gtk版本. 解压 下载下来一般是tar.gz文件,运行: $tar -zxvf eclipse-SDK-3.7.1-linu

Hadoop学习笔记(2) ——解读Hello World

Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello Word. OK,我们先来看一下当时在命令行里输入的内容: $mkdir input $cd input $echo "hello world">test1.txt $echo "hello hadoop">test2.txt $cd .. $bin/ha