本文是个人对Hadoop权威指南,第二章MapReduce重点总结
一、 相关概念
作业(Job):客户端执行的一个工作单元,包括输入数据、MapReduce程序和配置信息
任务(Task):Hadoop把作业(Job)分为若干个任务来执行,包括Map任务和Reduce任务两类任务,这些任务运行在集群的节点上,并通过Yarn调度,如果一个任务失败,他将在另一个不同的节点上自动重新调度运行。
二、 主要工作流程
(1) 分片
有几个分片就有几个Map任务
注:分片的大小一般为hdfs的一个快的大小128MB,这是因为Hadoop在存储有输入数据的节点上运行(数据本地化),对于任何一个HDFS节点,基本上都不可能同时存储2个数据块,因此分片中的部分数据要通过网络传输到Map任务运行的节点。与使用本地数据运行整个map任务相比,这种方法效率更低。
(2) 执行map任务
Map任务根据用户自定义的映射规则,输出一系列<key,value>作为中间结果
(3) shuffle(洗牌)
对第(2)步骤的中间结果进行一定的分区(partition)、排序(sort)、合并(Merge)操作,得到<key,valuelist形式的中间结果>
(4) 执行reduce任务
第(3)步骤的中间结果作为输入由用户自定义的reduce函数处理,生成最终结果
注:reduce任务的数量并非由输入数据的大小决定,是独立指定。Reduce输出结果的第一个复本存储在本地节点上,其他复本出于安全考虑存储在其他机架的节点中。
三、wordcount程序
(1)Map函数
package com.lari.demo;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.Text;
public class MyMapper extends Mapper<IntWritable, Text, Text, IntWritable>{
//Map是个泛型类,有四个形参,分别指定map函数输入键,输入值,输出键、输出值
//输入键是一个长整型数偏移量,输入值是一行文本
//输出键是一行文本,输出值是一个数
private static final IntWritable one = new IntWritable(1);
//Hadoop本身提供了一套可优化网络序列化的基本类型,不直接使用java内嵌的类型
@Override
protected void map(IntWritable key, Text value, Mapper