大数据技术MapReduce
1.1 分布式并行编程
1.出现的原因
大规模的集成电路的制作工艺已经到达一个极限,从2005年开始摩尔定律逐渐失效。为了提升程序的性能。就把希望寄托到cpu上。于是人们就借助分布式并行编程提高程序的运行性能。
- 分布式程序运行在大规模的计算机集群上,
- 集群中包括大量廉价服务器,
- 可以并行执行大规模数据处理任务,从而获取海量的计算能力
2.分布式并行编程和传统的程序开发的区别
传统的程序都是以单指令,单数据流的方式顺序执行,虽然这种方式符合人类的思维习惯。但是这种程序
- 性能受到单台机器性能的限制
- 可扩展性差
分布式并行程序运行在由大量计算机构成的集群上
- 可以利用集群的并行处理能力,同时向集群中增加新的计算节点
- 可以容易实现计算能力的扩充
1.2MapReduce模型简介
谷歌的三篇论文:GFS,MapReduce,BigTable
MapReduce是谷歌公司的核心计算模型。
MapReduce将复杂的,运行在大规模集群上的并行计算过程高度的抽象到两个函数:Map和Reduce
MapReduc的设计理念: 计算向数据靠拢
MapReduce的策略: 分而治之
hadoop框架是有java实现的,但是MapReduce应用不一定用java来写
1.3Map和Reduce
MapReduce模型的核心是Map和Reduce函数,二者都是由应用程序开发者负责具体实现的。
程序员只要关注如何实现Map和Reduce函数,而不需要处理并行编程中的其他复杂问题。
Map和Reduce都是以<key,value>作为输入,按照一定的映射规则转换成另外一个或者一批<key,value>进行输出
函数 | 输入 | 输出 | 说明 |
---|---|---|---|
Map | <k1,v1> | List(<k2,v2>) | (1)将小数据集解析成一批<key,value>对,输入Map函数中进行处理(2)每一个输入的<k1,v1>会输出一批<k2,v2>,<k2,V2是计算的中间结果> |
Reduce | <k2,List(v2)> | <k3,v3> | 输入的中间结果<k2,list(v2)>中的,List(v2)表示一批属于同一个k2得value |
1.4MapReduce的工作流程
1.4.1 MapReduce的各个执行阶段
- MapReduce框架使用InputFormat模块做Map前的预处理。然后将输入的文件分为逻辑上的多个InputSpit。InputSpit是MapReduce对文件处理和运算的输入单位,只是一个逻辑概念。Inputspit并没有对文件进行实际切割,只是记录了处理数据的位置和长度。
- InputSplit是逻辑切分而非物理切分。通过RecordReader(RR)根据InputSplitd的信息,加载数据并转换为合适的Map任务读取的键值对,输入给Map任务。
- Map任务会根据用户定义的映射规则,输出一系列的<key,Value>作为中间结果。
- 为了让Reduce可以并行处理Map结果。需要对Map的输出进行分区,排序,合并,归并等操作。得到<key,value-list>形式的中间结果。再交给相应的Reduce进行处理。这个过程叫做Shuffle。
- Reduce以系列的<key,value-list>作为输入执行用户的逻辑,输出结果给OutputFormat模块。
- OutputFormat模块进行验证,满足输出Reduce结果到分布式文件系统
1.4.2Shuffle过程
Reduce端的Shuffle过程
- 输入数据和执行Map任务
- 写入缓存
- 溢写(分区,排序,和合并)
- 文件归并
Reduce端的Shuffle过程
- 领取数据
- 归并数据
- 把数据输入给Reduce任务