MapReduce是什么
1.MapReduce是分布式计算的鼻祖,通过它可以更容易去理解分布式计算的思想和架构。
2.HiveSql的底层用的就是MapReduce
3.很多分布式计算引擎都借鉴了MapReduce
大数据计算引擎的发展
第一代: MapReduce IO硬盘+网络
第二代: Tez IO硬盘+网络+DAG
第三代: Spark 内存+网络+DAG
第四代: Flink 内存
MapReduce的思想
1.MapReduce会将一个大的计算任务进行拆分,拆分成小任务,让这些小任务在不同的计算机中进行处理,最后在将这些小任务的结果整体汇总
2.MapReduce分为两个阶段,一个map阶段负责任务拆分,一个reduce阶段负责任务汇总
3.整个MapReduce的流程可以分为三个阶段,map/shuffle/reduce
MapReduce编程
hadoop jar jar包.jar 主类
hadoop jar moudle03_mapreduce-1.0-SNAPSHOT.jar pack01_wordcount_base.WordCountDriver
#hadoop jar moudle03_mapreduce-1.0-SNAPSHOT.jar
#hadoop jar moudle03_mapreduce-1.0-SNAPSHOT.jar /input /output/wordcount
MapReduce的shuffle阶段
分区
1、分区就是分文件,本质是将不同的键值对,最后输出的不同的文件中,理解为将数据进行拆分
2、实现的方式是;在Map阶段对k2打标记,标记相同的数据就会分到同一个分区,同一个分区的数据会被同一个redue拉取
if(id % 2 == 0){
return 0;
}else{
return 1;
}
3、如果设置了分区则会有多个文件输出,则需要有多个reduce,相同标记的K2数据会被同一个reduce
处理,多个reduce就会产生多个结果文件
4、partition原来就是map结束之后根据key值不同,自定义打个标签。。。然后再由不同的reducer拉一下。。
排序
1、MapReduce中只能根据K2进行排序
2、如果想按照某个字段排序,则应该把这个字段包含在K2中
1、如果在MR中自定义Java类,则MR对该类有以下要求
1) 要求该类必须能够被序列号 : 实现接口 Writable
2) 如果该类作为K2,则要求该类必须指定排序规则,被排序: 实现WritableComparable接口
2、Writable和WritableComparable关系
public interface WritableComparable<T> extends Writable, Comparable<T> {}
Combiner(规约)
1、规约(Combiner)是MapReduce中的优化手段,将每一个Map的数据进行提前的聚合,减少Map端和Reduce端网络传输的数据量
2、规约可以理解为Reduce的逻辑在每一个Map端先执行一遍
3、Reduce是对所有的Map的数据进行汇总,而规约是对每一个Map的结果进行汇总
4、Combiner只是一种优化手段,不能改变最终的执行结果
规约的实现步骤:
1、自定义类继承Reducer类
2、重写reduce方法,在该方法中实现规约
3、在主类中设置规约类
job.setCombinerClass(CustomCombiner.class)