初探
1、功能
MapReudce的发展
- Hadoop1:分布式并行计算框架,
类似于YARN+Mapreduce
- Hadoop2:分布式编程模型
分布式计算由YARN来实现
- MapReduce的 主要功能:实现分布式程序的开发
提供了一套完整的分布式程序的API框架
- 大数据存储:必须将一个大的文件,拆分成多个小的块,交个多台机器并行存储,提供并行的读写
- 大数据计算:必须将一个大的任务,拆分成多个小的任务,交个多台机器并行运行,提供并行的计算
怎么提高性能效率的?
用多台机器一起处理来代替一台机器处理
问题:大数据就是开发一些数据处理的程序来实现对数据的计算,程序必须为可以分布式在多台机器上并行运行计算的程序,怎么实现?
- 自己开发实现:多线程并发运行
- 复杂度和成本非常高
- 利用封装好的分布式的API来开发
- 将需求的逻辑代码填空填到这个框架,这个框架会自动帮你实现分布式
- 只要给定数据处理的逻辑
举例:1加到9
- 只要给定逻辑:1,2,3,4,5,6,7,8,9,每个数字相加
- 要
处理的数据
是什么? - 要
实现的逻辑
是什么? - 要
结果保存的地方
在哪里?
- 要
- MapReduce:自动将这个逻辑进行拆分和计算【YARN】以及合并的逻辑
- task1:1+2+3 = 6
- task2:4+5+6 = 15
- task3: 7+8+9 = 24
- task4 : 6+15+24 = 45
2、设计模型
- 设计思想:
分而治之
的思想- 1+2+3+4+5+6+7+8+9
- 分:将大的任务逻辑,拆分成多个小的任务逻辑
- 1+2+3
- 4+5+6
- 7+8+9
- 合:将每个小任务的结果再根据对应的任务逻辑进行何必并
- 6+15+24 = 45
3、阶段or分类
不完整划分:三个阶段
只有三大阶段的程序:Input、Map、Output
没有Shuffle和Reduce
job.setNumReduceTasks(0);//设置Reduce个数为0.不论有没有reduce的类,都不会执行
类似于SQL:select 1 from 2 where 3 limit 7
- 结果文件
part-m-00000
应用场景
- 不需要聚合,只做一对一的处理或者过滤之类的
- 1000行数据,将脏数据过滤,保留合法的数据,不需要聚合
完整划分:五大阶段
完整的五大阶段的程序:Input、Map、Shuffle、Reduce、Output
如果你需要分组、排序、聚合,就需要shuffle和reduce
类似于SQL语法:select 1 from 2 where 3 group by 4 having 5 order by 6 limit 7
Input:
负责整个程序的输入,我们要处理的数据在什么地方
- MapReduce程序默认就会读取HDFS上的文件,作为程序的输入
- MapReduce的API中:InputFormat
- 这个类默认使用的TextInputFormat:默认从HDFS上读取数据
- 其他举例:DBInputFormat:可以从数据库中读取数据
Map:
分,将任务在逻辑上划分多个小的任务,每个小的任务会对应一个MapTask
- 负责处理Input传递过来的数据
- 每个MapTask处理一部分数据
- 假设:
- Input:256M数据
- Map:2个MapTask,每个MapTask处理128M数据
- 处理的逻辑:由开发者自定义,
重写一个map方法
public void map(Input阶段的数据){
//这个方法中定义你的对Input阶段传进来的数据怎么进行处理
}
每个MapTask会对自己的每一条数据调用这个方法来处理
Shuffle:
MapReduce自带的一个功能
可以干预但是不能避免
- 会自动对Map输出的数据进行处理
- 处理的逻辑:
分组、排序
- 处理逻辑类似于SQL,当初设计的时候就是参考SQL逻辑的
select 1 from 2 where 3 group by 4 having 5 order by 6 limit 7
Reduce:
合,将shuffle处理的结果,进行聚合,默认会启动一个ReduceTask将上一步所有的数据再次进行处理
- 合并逻辑:由开发者自定义
- 提供了一个方法:
重写reduce方法
public void reduce(SHuffle的输出){
//定义聚合的逻辑
}
Output:
负责整个程序的输出,将处理以后得到的结果进行保存
- MapReduce程序默认会将结果写入HDFS,保存为文件
- MapReduce的API中:OutputFormat
- 这个类默认使用TextOutputFormat:默认将结果写入HDFS
- 其他举例:DBOutputFormat:可以将结果写入数据库
三个过程
- 输入:Input:处理的数据是什么
- 处理:数据怎么处理
- Map:拆分:处理的逻辑由用户自定义,重写map方法
- Shuffle:处理逻辑:分组和排序
- Reduce:合并:处理的逻辑由用户自定义,重写reduce方法
- 输出:Output:结果保存在什么地方