Map/Reduce的类体系架构

Map/Reduce案例解析:

  先以简单的WordCount例程, 来讲解如何去描述Map/Reduce任务.

public static void main(String[] args) throws Exception {
  // *) 创建Configuration类, 用于获取Map/Reduce的执行环境
  Configuration conf = new Configuration();
  // *) 对命令行参数进行解析
  String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  if (otherArgs.length != 2) {
    System.err.println("Usage: wordcount <in> <out>");
  System.exit(2);
  }
  // *) 创建Job任务实例
  Job job = new Job(conf, "word count");
  job.setJarByClass(WordCount.class);
  // *) 设置Mapper类
  job.setMapperClass(TokenizerMapper.class);
  // *) 设置Combiner类
  job.setCombinerClass(IntSumReducer.class);
  // *) 设置Reducer类
  job.setReducerClass(IntSumReducer.class);
  // *) 设置输出结果的Key类型为Text
  job.setOutputKeyClass(Text.class);
  // *) 设置输出结果的Value类型为Text
  job.setOutputValueClass(IntWritable.class);   // *) 设置InputFormat和OutputFormat的HDFS路径
  FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  // *) 等待Map/Reduce任务结束
  System.exit(job.waitForCompletion(true) ? 0 : 1);
}

  评注: 具体的一个Job需要设置Mapper和Reducer类, 来决定如何处理数据. 而对于InputFormat/OutputFormat则决定了其数据输入/输出源.

Mapper类的解析
  Mapper抽象类, 引入内部抽象类Context, 通过采用模板方法的设计模式.

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {

  public abstract class Context
      implements MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
  }   protected void setup(Context context)
      throws IOException, InterruptedException {
  }   protected void map(KEYIN key, VALUEIN value, Context context)
      throws IOException, InterruptedException {
    context.write((KEYOUT) key, (VALUEOUT) value);
  }   protected void cleanup(Context context)
      throws IOException, InterruptedException {
  }   // *) 采用模板方法来实现
  public void run(Context context)
      throws IOException, InterruptedException {
  } }

  评注: setup扮演map初始化的工作, cleanup是map任务结束后的工作, 而map则是具体key/value对操作的处理函数.
  来具体看下map函数中精华run函数的定义:

// *) map阶段的初始化工作
setup(context);
try {
  // *) 循环遍历key/value对
  while (context.nextKeyValue()) {
    // *) 进行map回调处理
    map(context.getCurrentKey(),
      context.getCurrentValue(), context);
  }
} finally {
  // *) map阶段的清除工作
  cleanup(context);
}

  评注: 采用类模板方法的设计模式(setup, map, cleanup, 通过run函数合理的串联)

InputFormat类的构成
  InputFormat中最重要的两个类是InputSplit和RecordReader.
  *) InputSplit: 是Map数据源的一个分片, 对应于一个具体map任务.
  *) RecordReader: 针对一个具体的InputSplit, 封装的一个记录读取器.
  具体代码如下所示:

public abstract class InputFormat<K, V> {

  // *) 获取InputSplit, 用于Map数据的拆分依据
  public abstract List<InputSplit> getSplits(JobContext context)
        throws IOException, InterruptedException;
  // *) 针对InputSplit, 获取RecordReader类实例
  public abstract RecordReader<K,V> createRecordReader(
      InputSplit split, TaskAttemptContext context)
        throws IOException, InterruptedException; }

  评注: InputSplit数决定Map个数, 同时决定了数据的划分和规模, 而RecordReader则决定Key/Value的格式和具体数值. 这些概念对于数据的生成至关重要.

Reducer/OutputFormat
  Reducer类和Mapper类定义类似, OutputFormat类与InputFormat类似, 简略之.

总结:

该文还没有完结, 先占个坑....

Map/Reduce的类体系架构的更多相关文章

  1. Map/Reduce个人实战--生成数据测试集

    背景: 在大数据领域, 由于各方面的原因. 有时需要自己来生成测试数据集, 由于测试数据集较大, 因此采用Map/Reduce的方式去生成. 在这小编(mumuxinfei)结合自身的一些实战经历, ...

  2. Hadoop体系架构简介

    今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbase+Pig+Hive+Spark+Storm开始一直讲到HDFS的底层实现,MapReduce ...

  3. mapreduce: 揭秘InputFormat--掌控Map Reduce任务执行的利器

    随着越来越多的公司采用Hadoop,它所处理的问题类型也变得愈发多元化.随着Hadoop适用场景数量的不断膨胀,控制好怎样执行以及何处执行map任务显得至关重要.实现这种控制的方法之一就是自定义Inp ...

  4. 分布式基础学习(2)分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...

  5. [转]OpenContrail 体系架构文档

    OpenContrail 体系架构文档 英文原文:http://opencontrail.org/opencontrail-architecture-documentation/ 翻译者:@KkBLu ...

  6. 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...

  7. Thrift之TProcess类体系原理及源码详细解析

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细 ...

  8. Kafka体系架构详细分解

    我的个人博客排版更舒服: https://www.luozhiyun.com/archives/260 基本概念 Kafka 体系架构 Kafka 体系架构包括若干 Producer.若干 Broke ...

  9. Python-函数式编程-map reduce filter lambda 三元表达式 闭包

    lambda 匿名函数,核心是作为算子,处理逻辑只有一行但具有函数的特性,核心用于函数式编程中 三元运算符 其实本质上是if分支的简化版,满足条件返回 if 前面的值,不满足条件返回 else后面的值 ...

随机推荐

  1. java正则表达式之java小爬虫

    这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...

  2. 高效前端优化工具--Fiddler入门教程

    简介: Fiddler是用C#编写的一个免费的HTTP/HTTPS网络调试器.Fiddler是以代理服务器的方式,监听系统的网络数据流动英语中Fiddler是小提琴的意思,Fiddler Web De ...

  3. [Js]表格排序

    思路:遍历每个li,并把它们存放到数组中去,然后通过sort()方法进行排序,再插入 <body>    <input type="button" value=& ...

  4. for update造成的Oracle锁表与解锁

    我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...

  5. centos 升级 python后 python-setuptools pip 安装依赖报错

    解决办法: $ wget https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/trunk/distribute_setup.p ...

  6. HTTP状态代码

    1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101 (切换协议) 请求 ...

  7. hdu 2082

    ps:get到了母函数...看了好久的模板与介绍....似懂非懂..决定要多找些题来试试... 代码: #include "stdio.h" #include "stri ...

  8. node.js 学习书籍推荐

    今天向大家推荐一本node.js开发的书籍,本人刚刚看完. 建议:如果你是node.js小白,下边的介绍你可以看一下,如果不是请直接return. <Node.js开发指南>是一本带有开发 ...

  9. 表设计VIso

  10. Linux---- vim 插件

    http://hi.baidu.com/omnice/blog/item/4ba97317cc67cc10962b4378.html fuzzyfinder.vim 可以替代四个插件, 不过这个插件也 ...