Map/Reduce的类体系架构
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的类体系架构的更多相关文章
- Map/Reduce个人实战--生成数据测试集
背景: 在大数据领域, 由于各方面的原因. 有时需要自己来生成测试数据集, 由于测试数据集较大, 因此采用Map/Reduce的方式去生成. 在这小编(mumuxinfei)结合自身的一些实战经历, ...
- Hadoop体系架构简介
今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbase+Pig+Hive+Spark+Storm开始一直讲到HDFS的底层实现,MapReduce ...
- mapreduce: 揭秘InputFormat--掌控Map Reduce任务执行的利器
随着越来越多的公司采用Hadoop,它所处理的问题类型也变得愈发多元化.随着Hadoop适用场景数量的不断膨胀,控制好怎样执行以及何处执行map任务显得至关重要.实现这种控制的方法之一就是自定义Inp ...
- 分布式基础学习(2)分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...
- [转]OpenContrail 体系架构文档
OpenContrail 体系架构文档 英文原文:http://opencontrail.org/opencontrail-architecture-documentation/ 翻译者:@KkBLu ...
- 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...
- Thrift之TProcess类体系原理及源码详细解析
我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细 ...
- Kafka体系架构详细分解
我的个人博客排版更舒服: https://www.luozhiyun.com/archives/260 基本概念 Kafka 体系架构 Kafka 体系架构包括若干 Producer.若干 Broke ...
- Python-函数式编程-map reduce filter lambda 三元表达式 闭包
lambda 匿名函数,核心是作为算子,处理逻辑只有一行但具有函数的特性,核心用于函数式编程中 三元运算符 其实本质上是if分支的简化版,满足条件返回 if 前面的值,不满足条件返回 else后面的值 ...
随机推荐
- Oracle实现自增方式:序列+触发器
Oracle不能像MySQL那样设置主键自增,Oracle用 <序列+触发器>的方式使数据表的一列或多列实现自增 序列sequence+触发器trigger:实现数据表S_DEPART中的 ...
- IBatis.Net 表连接查询(五)
IBatis.Net之多表查询: 一.定制实际对应类的方式 首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置: 首先新建两张表如下: 为两张表建立外键: ALTER TABL ...
- [转载]android的消息处理机制(图+源码分析)——Looper,Handler,Message
2013-12-18 14:17:33 转载自: http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html 请跳转到转载 ...
- UINavigationController 子控制器管理原理
UINavigationController 显示在导航控制器上的控制器 永远是栈顶控制器 后进先出 先进后出原则 /** * 程序获得焦点才能获取触摸事件 * */- (void)applicat ...
- 离线安装chrome插件
1. 先百度下载自己要安装的chrome插件,比如:Postman 和 Json View. 2.下载完应该得到的是扩展名为crx的文件. 比如: Postman-REST-Client_v0.8.4 ...
- Android 之 数据存储
在Android操作系统中,提供了5种数据存储方式:SharedPreferences存储,文件存储,SQLite数据库存储,ContentProvider存储和网络存储. 一.SharedPrefe ...
- PL/SQL : Procedural Language / Structual Query Language and it is an exrension to SQL.
SQL is not very flexible and it cannot be made to react differently to differing sutuations easily. ...
- checkbox的全选、反选(计算价格)
package com.baidu.jisuan; import java.util.ArrayList;import java.util.List; import com.baidu.adapter ...
- URL动态赋值
url动态赋值: 指的是url中包含{selector},即花括号括起来的jQuery选择器,当提交该url时,框架会自动将selector对应元素的值替换到花括号所占区域. (感觉实现了一点类似el ...
- Hadoop中常用的InputFormat、OutputFormat(转)
Hadoop中的Map Reduce框架依赖InputFormat提供数据,依赖OutputFormat输出数据,每一个Map Reduce程序都离不开它们.Hadoop提供了一系列InputForm ...