转载:
一. MapReduce2.0 编程模型
关于 MR 编程模型请参考上一篇:[Hadoop 入门学习系列之四] MapReduce 2.0 应用场景和原理, 基本架构和编程模型
二. MapReduce2.0 编程接口
三种编程方式
Java(最原始的方式)
Java 编程接口组成;
旧 API 所在 java 包: org.apache.hadoop.mapred
新 API 所在 java 包 :org.apache.hadoop.mapreduce
新 API 具有更好的扩展性;
两种编程接口只是暴露给用户的形式不同而已, 内部执行引擎是一样的;
旧 API 可以完全兼容 Hadoop 2.0, 但新 API 不行
从 hadoop 1.0.0 开始, 所有发行版均包含新旧 两类 API;
Hadoop Streaming(支持多语言)
与 Linux 管道机制一致
? 通过标准输入输出实现进程间通信
? 标准输入输出是任何语言都有的
? 几个举例:
- cat 1.txt | grep "dong" | sort
- cat 1.txt | python grep.py | java sort.jar
- Hadoop Pipes(支持 C/C++)
备注: Java 编程接口是所有编程方式的基础; 不同的编程接口只是暴露给用户的形式不同而已, 内部执行引擎是一样的; 不同编程方式效率不同.
三. MapReduce2.0 编程步骤及演示, 以 WordCount 为例 [java 版]
1.WordCount 问题
2.Map 阶段
3.Reduce 阶段
4.mapper 设计与实现
5.reducer 设计与实现
6.main 函数设计与实现
7. 程序运行
8. 问题整理
[1] 输入数据格式解析
使用默认的 TextInputFormat
? 每个 Map Task 处理一个 split;
? 一个 split 大小等于一个 block[也可以是多个] ;
? 如果最后一行数据被截断, 则读取后一个 block 前半部分;
? 转换成 key/value 对, key 是偏移量, value 是行内容.
[2] 数据流
[3] 输入数据解析
- public interface InputFormat<K, V> {
- InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
- RecordReader<K, V> getRecordReader(InputSplit split,
- JobConf job,
- Reporter reporter) throws IOException;
- }
- 1
- 2
- 3
- 4
- 5
- 6
默认为 TextInputFormat, 针对文本文件的;
用户可通过参数 mapred.input.format.class 设置 InpuFormat 实现
[4] Mapper-map 处理逻辑
- public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable {
- void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter)
- throws IOException;
- }
- 1
- 2
- 3
- 4
新 API 位于 org.apache.hadoop.mapreduce.Mapper 中
[5] Partitioner-map 输出结构分片
- org.apache.hadoop.mapred(旧 API):
- public interface Partitioner<K2, V2> extends JobConfigurable {
- int getPartition(K2 key, V2 value, int numPartitions);
- }
- org.apache.hadoop.mapreduce(新 API):
- public abstract class Partitioner<KEY, VALUE> {
- public abstract int getPartition(KEY key, VALUE value, int numPartitions);
- }
6.Reducer-reduce 处理逻辑
- org.apache.hadoop.mapred(旧 API):
- public interface Reducer<K2, V2, K3, V3> extends JobConfigurable, Closeable {
- void reduce(K2 key, Iterator<V2> values,
- OutputCollector<K3, V3> output, Reporter reporter)
- throws IOException;
- }
新 API 位于 org.apache.hadoop.mapreduce.Reducer 中
7. 小结
四. 总结
本篇以经典的例子 wordcount 来详细介绍 MR 的编程过程和思想, 非常有参考学习价值, 自己一定要自己多敲几遍代码代码, 熟练掌握其中的代码执行原理, 未之后的研究 hadoop 的源码打好基础.
----------------
来源: http://www.bubuko.com/infodetail-3357578.html