MapReduce是一种分布式并行编程框架
借助一个集群通过堕胎机器同时并行处理大规模数据集
相关的并行编程框架
并行编程模型和传统的并行编程框架的区别
MapReduce包含两大函数:Map和Reduce
MapReduce策略:
采用分而治之的做法
MapReduce理念
计算向数据靠拢,而不是数据向计算靠拢
什么事数据向计算靠拢?
即完成一次数据分析时,选择一个计算节点,把运行数据分析的程序放在计算节点上运行
然后把它所涉及的数据,全部从各个不同的节点上面拉过来,传输到计算发生的地方
MapReduce采用计算向数据靠拢的方式
MapReduce架构:Master/Slave的架构
Map函数和Reduce函数
Map函数
Reduce函数
MapReduce体系结构
Client(客户端)
JobTracker(作业跟踪器)
TaskTracker(任务调度器)
执行具体的相关任务一般接受JobTracker发送过来的命令
把一些自己的资源使用情况,以及任务的运行进度通过心跳的方式,也就是heartbeat发送给JobTracker
使用slot概念,将自己机器的cpu、内存资源等分为slot
Task任务也有两种:map任务和reduce任务
MapReduce工作流程
MapReduce执行的各个阶段
分片的具体过程
一个大文件在HDFS中可能由多个块组成,如下图例子在物理上被分为6块,但在逻辑上通过split分块四块内容
每个分片都是一个map任务,如果分片过少,影响并行效率;若分片过多,map切换耗费相关管理资源,影响执行效率
一般来说会将一个块的大小作为HDFS的分片大小,因为假如block1和block2不在一个机器上面,block1运行split1的map任务,此时
需要将数据从block2机器存到block1所在的机器,会出现额外的数据开销
Reduce任务的数量
Shuffle过程简介
Shuffle过程分类
Map端的Shuffle过程
每个Map任务都会给其分配相应的缓存,一般来说是100M
如果缓存满了再启动溢写,可能会导致后来Map生成的值无法写入缓冲区,丢失值。
因此,在溢写的时候会设置一个溢写比例,例如80%,即如果写出内容占缓存比例的80%的时候启动溢写,剩余20M空间可以供给给后来生成的map
溢写的分区操作,主要是利用分区分给不同的Reduce任务,排序操作内部会自动完成,合并操作不是必须的,若用户定义合并操作,则会启动合并操作,如(a,1)(a,1)会被合并为(a,2)
Reduce端的Shuffle过程
整个执行过程
程序部署:将程序分发到不同机器上
分配Worker执行Map任务和Reduce任务
选择空闲Worker机器进行分片,然后读取数据,分给不同的Worker执行Map任务,生成(key,value)键值对,输出结果先写到缓存
缓存满了会将数据写到本地
Reduce机器将数据拉回到本地处理
将相关的结果写到输出文件中去
WordCount程序任务:满足MapReduce分而治之的要求
一个WordCount执行过程的实例
假设用户没有定义合并(combine)操作,shuffle操作之后生成的是(key,value-list)形式
假如用户定义了Combine操作:
相关应用
举例:MapReduce实现关系的自然连接
用Map实现自然连接的过程:原理
具体过程
见:[MapReduce编程实践(Hadoop3.3.5)_厦大数据库实验室博客 (xmu.edu.cn)](