首先介绍一下Hadoop的四大组件:
- HDFS:分布式存储系统
- MapReduce:分布式计算系统
- YARN:hadoop的资源调度系统
- Common:以上三大组件的底层支撑组件,主要提供工具包和RPC框架等
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
其核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
为什么要用MapReduce?
- 海量数据在单机上处理因为硬件资源的限制,无法胜任;
- 而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度;
- 引入MapReduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。
MapReduce的整体结构:
- MRAppMaster:MapReduce Application Master,分配任务,协调任务的运行;
- MapTask:阶段并发任务,负责Mapper阶段的任务处理——YARNChild;
- ReduceTask:阶段汇总任务,负责Reducer阶段的任务处理——YARNChild;
WordCount程序代码示例:
//Mapper阶段
package com.wc;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/*
* Map阶段
*
* 四个泛型:
* LongWritable:框架读取文件输入的key的类型
* Text:框架读取文件输入的value的类型
* Text:经Map阶段处理后输出的key的类型
* IntWritable:经Map阶段处理后输出的value的类型
*
* */
public class Mapper_wc extends Mapper<LongWritable, Text, Text, IntWritable> {
/*
* 参数:
* key:框架读取每一行的偏移量
* value:框架读取每一行的内容
* context:上下文对象,用于框架——Map——Reduce之间的数据传输
*
* 这个方法每一行调用一次,一次获取文档中一行的内容
*
* */
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
/*
* 1. 转Text类型转Java.String类型
* 2. 对转String的value根据业务需求进行一系列的逻辑操作
* (对文件中每一行的内容进行切分等)
* 3. 将得到的需要输出的值转为hadoop.io下的类型
* 4.