`
zc985552943
  • 浏览: 291000 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Babe4ca6-5e6f-33aa-9078-762ee3ccfb7e
云计算--hadoop
浏览量:11866
5e98c2c1-2a82-3388-bc80-7fca0170bb12
redis解说
浏览量:27146
088014c7-4d3f-39ce-b72e-4ebe7046a134
MongoDB读书笔记
浏览量:16003
D2b74847-c860-3e26-96fe-3fa4498d6348
Maven读书笔记
浏览量:27234
688db20f-402d-3a1d-8188-d6153d6c7465
Java通信
浏览量:13675
社区版块
存档分类
最新评论

004_hadoop中MapReduce详解_1

阅读更多

1.什么是MapReduce

MapReduce是Google公司的核心计算模型,我在前面提到过,Google的三大论文。hadoop受到Google的启发开发出自己的MapReduce框架,基于这个框架写出的应用程序能够在上千台计算机上组成大型集群,并以一种可靠容错的方式并行处理上T级别的数据,实现hadoop在集群上的数据和任务并行计算与处理
1.一个MapReduce作业通常会把输入的数据集切分成若干个独立的数据块,由Map Task以完成并行的方式处理他们。对于Map的输出,框架会首先进行排序,然后把结果输入给Reduce Task。
2.通常计算节点和数据节点在一起,这样可以减少网络带宽中数据的传输,达到高效利用

MapReduce有两个角色:
1.JobTracker:负责任务的管理和调度(一个hadoop集群中只有一台JobTracker)
2.TaskTracker:负责执行工作,在DataNode节点上执行(Map函数和Reduce函数运行的节点)

下图是MapReduce的流程简介:


2.MapReduce处理流程

我们使用hadoop里面的一个简单的例子看一下MapReduce的处理流程。打开$HADOOPHOME\hadoop-1.0.4\src\examples\org\apache\hadoop\examples下面有一个WordCount.java。代码如下:

package org.apache.hadoop.examples;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {
/**
 * 
 * @title TokenizerMapper
 * @description Mapper后面的四个参数含义:
 * Object:输入到Map中的Key
 * Text:输入到Map中的Value 
 * Text:Map的输出Key也是Reduce的输入的Key 
 * IntWritable:Map的输出Value也是Reduce的输入Value
 * @author hadoop
 * @version WordCount
 * @copyright (c) SINOSOFT
 *
 */
  public static class TokenizerMapper 
       extends Mapper<Object, Text, Text, IntWritable>{
    
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    /**
     *  重写Map函数
     *  Map函数的意思:使用空格切割value。生成一个一个的单词。
     *  模拟Map的输入:<偏移量,"hadoop hadoop haha hive redis redis LVS LVS NB">
     *  模拟Map的输出:<hadoop,1>;<hadoop,1>;<haha,1>;<hive,1>;<redis,1>;<redis,1>;<LVS,1>;<LVS,1>;<NB,1>
     */
    public void map(Object key, Text value, Context context ) throws IOException, InterruptedException {
    	//String类的工具类,可以切割字符串。默认使用空格切割字符串
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }
  /**
   * 
   * @title IntSumReducer
   * @description Reduce函数中Reducer<Text,IntWritable,Text,IntWritable>的泛型含义
   * Text:输入到Reduce中的Key,也是Map输出的Key
   * IntWritable:输入到Reduce中的Value,也是Map输出的Value
   * Text:Reduce的输出Key
   * IntWritable:Reduce的输出Value
   * @author hadoop
   * @version WordCount
   * @copyright (c) SINOSOFT
   *
   */
  public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();
    /**
     * 在Reduce函数的输入是Map函数的输出,并且Map输出相同的Key会放在一起,也就生成了List类型的Value
     * 模拟Reduce的输入前:<hadoop,1>;<hadoop,1>;<haha,1>;<hive,1>;<redis,1>;<redis,1>;<LVS,1>;<LVS,1>;<NB,1>
     * Reduce中的洗牌:<hadoop,List values>;<haha,List values>;<redis,List values>;<LVS,List values>;<NB,List values>:相同的Key放在一组
     * 模拟Reduce的输入:<hadoop,List values>;<haha,List values>;<redis,List values>;<LVS,List values>;<NB,List values>
     * 模拟Reduce的输出:<hadoop, 2>;<haha, 1>;<redis, 2>;<LVS, 2>;<NB, 1>
     */
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    
    Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path("/user/helloMR")); //Map的输入
    FileOutputFormat.setOutputPath(job, new Path("/user/helloHDFS/success"));//Reduce的输出
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

 在main方法中有:FileInputFormat.addInputPath(job, new Path("/user/helloMR"));
提供了Map阶段的输入,具体是怎么做到的呢?
在hadoop中使用InputSplit将输入的数据发送给每个单独的Map,InputSplit并非保存数据本身,而是一个分片长度和一个记录数据位置的数组,InputSplit对象可以通过Inputformat()来生成。
数据-->Map将分片-->InputFormat()-->getRecordReader()-->生成RecordReader-->通过createKey();createValue()-->Map需要的<key,Value>
现在可以在eclipse里面运行:



 



 

3.WordCount中的数据流程



 
 

  • 大小: 79.6 KB
  • 大小: 143.3 KB
  • 大小: 75.5 KB
  • 大小: 43.6 KB
2
1
分享到:
评论
1 楼 annmi_cai 2016-03-11  
好好学习,天天向上!

相关推荐

    006_hadoop中MapReduce详解_3

    "006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个部分,我们可能会探讨更深入的技术细节和优化策略。 MapReduce的工作流程分为两个主要...

    005_hadoop中MapReduce详解_2

    在Hadoop生态系统中,MapReduce是一种分布式计算框架,它允许我们处理海量数据并行化,非常适合大规模数据集的处理。本文将深入解析MapReduce的工作原理、核心组件以及如何编写一个基本的MapReduce程序。 MapReduce...

    Hadoop集群pdf文档

    Hadoop_Hadoop集群(第1期)_CentOS安装配置 Hadoop_Hadoop集群(第2期)_机器信息分布表 Hadoop_Hadoop集群(第4期)_SecureCRT使用 Hadoop_Hadoop集群(第5期)_Hadoop安装配置 Hadoop_Hadoop集群(第5期副刊)_...

    Hadoop_MapReduce教程

    ### Hadoop MapReduce 教程知识点详解 #### 一、Hadoop MapReduce 概述 Hadoop MapReduce 是一个强大的分布式计算框架,主要用于处理大规模数据集。它通过将任务分解成多个子任务来实现并行处理,从而极大地提高了...

    hadoop-eclipse-plugin-2.6.0.jar.zip_2.6.0_hadoop_hadoop plugin

    这个插件是针对Hadoop 2.6.0版本设计的,主要目标是集成Eclipse IDE,使得开发者可以在本地环境中便捷地创建、调试和管理Hadoop MapReduce项目。 一、插件功能详解 1. **项目创建与导入**:通过Hadoop Eclipse插件...

    cs245-as1-master_Hadoop运行demo_Hadoop学习demo_DEMO_

    【Hadoop运行DEMO详解】 Hadoop是一款开源的分布式计算框架,由Apache基金会开发,它设计用于处理和存储海量数据。在"cs245-as1-master_Hadoop运行demo_Hadoop学习demo_DEMO_"这个项目中,我们主要关注的是如何在...

    hadoop入门最好的文档

    1.细细品味Hadoop_Hadoop集群(第1期)_CentOS安装配置 2.细细品味Hadoop_Hadoop集群(第2期)_机器信息分布表 3.细细品味Hadoop_Hadoop集群(第3期)_VSFTP安装配置 4.细细品味Hadoop_Hadoop集群(第4期)_...

    大数据Hadoop核心之MapReduce详解

    大数据Hadoop核心之MapReduce详解 MapReduce是Hadoop核心模块之一,作为一个分布式运算程序的编程框架,用于用户开发基于Hadoop的数据分析应用。MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合...

    细细品味Hadoop_Hadoop集群(第11期副刊)_HBase之旅.pdf

    ### Hadoop集群与HBase应用详解 #### 一、HBase基本概念介绍 **1.1 引言** 随着大数据处理需求的日益增长,Hadoop生态中的HBase因其卓越的数据处理能力和灵活性,成为了众多企业的大数据解决方案之一。本文旨在...

    细细品味Hadoop_Hadoop集群(第5期)_Hadoop安装配置

    ### Hadoop集群构建与配置详解 #### 一、Hadoop概览及集群角色解析 **Hadoop**,作为Apache软件基金会旗下的一款开源分布式计算平台,以其核心组件**Hadoop分布式文件系统**(HDFS)和**MapReduce**而闻名。HDFS提供...

    细细品味Hadoop_Hadoop集群(第6期)_WordCount运行详解

    ### Hadoop集群中WordCount运行详解 #### 一、MapReduce理论简介 ##### 1.1 MapReduce编程模型概述 MapReduce是一种编程模型,用于处理和生成大型数据集。其核心理念是“分而治之”,即将大规模数据处理任务拆分...

    Hadoop安装教程_单机_伪分布式配置_Hadoop2.6.0_Ubuntu141

    【Hadoop安装教程:单机与伪分布式配置详解】 在大数据处理领域,Hadoop是一个广泛使用的开源框架,它允许在廉价硬件集群上处理大规模数据。本文将指导您如何在Ubuntu 14.04 64位系统上安装Hadoop 2.6.0,无论是...

    GIS_Tools_for_Hadoop使用介绍(ArcGIS与Hadoop集成)

    1. **系统配置**:为了有效地使用GIS Tools for Hadoop,首先需要确保操作系统满足一定的要求,并且安装了必要的软件,如SSH和RSYNC等。 2. **Hadoop安装**:Hadoop的安装过程涉及配置SSH无密码登录、上传文件以及...

    3-haddop_hadoop_

    1. **Hadoop核心概念**:理解Hadoop的分布式计算模型,包括HDFS的分块存储和MapReduce的并行处理机制。 2. **HDFS操作**:学习如何在HDFS上创建、上传、下载文件,以及执行基本的HDFS命令。 3. **集群搭建**:了解...

    hadoop2.X配置详解和mapreduce详解

    在Hadoop 1.x中,如果NameNode出现故障,整个集群将无法运行,因为NameNode负责管理文件系统的元数据。但在Hadoop 2.x中,通过引入两个NameNode,即一个处于Active状态,负责处理客户端请求,另一个处于Standby状态...

    Hadoop新MapReduce框架Yarn详解

    使用和学习过老Hadoop框架(0.20.0及之前版本)的同仁应该很熟悉如下的原MapReduce框架图:图1.Hadoop原MapReduce架构从上图中可以清楚的看出原MapReduce程序的流程及设计思路:可以看得出原来的map-reduce架构是...

Global site tag (gtag.js) - Google Analytics