一、什么是Mapreduce?
1.MapReduce是一个分布式计算框架
它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务
起源于Google
2.适用于大规模数据处理场景
每个节点处理存储在该节点的数据
3.每个job包含Map和Reduce两部分
二、MapReduce的组成
用户编写的程序分成三个部分:Mapper、Reducer和Driver
Mapper
MapReduce框架处理的数据格式是<K,V>键值对形式 Map端接收<K,V>键值对数据,经过处理输出新的<K,V>键值对
Map端处理逻辑写在Mapper类中的map()方法中
Reducer
Reduce端搜集多个Mapper端输出的<K,V>数据,进行汇总 Reducer的业务逻辑写在reduce()方法中
每一组相同k的<k,Iterator>组调用一次reduce()方法
Driver
整个程序需要编写一个Driver来进行提交 将自定义Mapper和Reducer类组合成一个job,并提交job对象
三、主要方法
Mapper主要方法
void setup(Context context)
org.apache.hadoop.mapreduce.Mapper.Context
void map(KEY key, VALUE value, Context context)
为输入分片中的每个键/值对调用一次
void cleanup(Context context)
void run(Context context)
可通过重写该方法对Mapper进行更完整控制
Reducer主要方法
void setup(Context context)
org.apache.hadoop.mapreduce.Reducer.Context
void reduce(KEY key, Iterable<VALUE> values, Context context)
为每个key调用一次
void cleanup(Context context)
void run(Context context)
可通过重写该方法来控制reduce任务的工作方式
四、Hadoop序列化
1.必须可序列化(serializable)
作用:网络传输以及持久化存储
IntWritable、LongWritable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等
2.都继承了Writable接口
并实现write()和readFields()方法
3.Keys必须实现WritableComparable接口
MapReduce框架会按照Key进行排序
Reduce阶段需要sort
keys需要可比较
五、MapReduce框架原理
1.MapReduce执行流程
split
计算分片
map
调用map()方法对数据进行处理
shffule
主要负责将map端生成的数据传递给reduce端
reduce
对Shffule阶段传来的数据进行最后的整理合并
2.MapReduce框架中核心类介绍
六、InputFormat接口
1.定义了如何将数据读入Mapper
InputSplit[] getSplits
InputSplit
表示由单个Mapper处理的数据
getSplits
方法将一个大数据在逻辑上拆分为InputSplit
RecordReader<K,V> getRecordReader
2.常用InputFormat接口实现类
FileInputFormat(抽象类)
TextInputFormat
KeyValueTextInputFormat
DBInputFormat