MapReduce
边学边写
MapReduce概述
1. MapReduce的定义
MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架
MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件结合成一个完整的分布式运运算程序,并发运行在一个Hadoop集群上
2. MapReduce优缺点
优点
- 易于编程
它简单的实现一些接口,就可以完成一个分布式程序。这个分布式程序可以分布到大量廉价的PC机器上运行;也就是说,编写一个分布式程序,跟写一个串行程序是一模一样的。就是因为这个特点,使得Hadoop编程变得非常流行。 - 良好的扩展性
当计算资源不能满足的时候,可以通过简单增加机器来扩展集群的计算能力。 - 高容错性
MapReduce的设计初衷就是使程序能够部署在廉价机器上,这就要求它具有很高的容错性。比如,其中一个机器挂掉,它可以上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程无需人工参与,完全是由Hadoop内部完成的。 - 适合PB级以上海量数据的离线处理
可以实现上千台服务器集群并发工作,提供数据处理能力。
缺点
- 不擅长实时计算
MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果 - 不擅长流式计算
流式计算的输入数据是动态的,而MapReduce的输入数据是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。 - 不擅长DAG(有向图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个程序的输出。在这种情况下,MapReduce并不是不能使用,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能的低下。
3. MapReduce 核心思想
- MR一般分两个阶段,Map和Reduce阶段
- Map阶段的并发MapTash,完全并行运行,互不相干
- Reduce阶段的并发ReduceTask,完全互不相干,依赖于MapTask
- 一个MapReduce编程模型只能有一个Map阶段和一个Reduce阶段。如果业务复杂,则只能多个MapReduce程序,串行运行
4. MapReduce进程
一个完整的MapReduce程序在分布式运行时有三个实例进程
- MRAppMaster:负责整个程序的过程调度及状态协调
- MapTask:负责Map阶段的数据处理流程
- ReduceTask:负责Reduce阶段的整个数据处理流程
WordCount案例
序列化案例
1. 概念
特点
- 紧凑:高效使用存储空间
- 快速:读写数据的开销小
- 可扩展:通信协议的升级,可升级
- 互操作性:支持多语言的交互 (数据互通)
2. 步骤
sz
rz
Mapreduce 切片(重点)
默认切片大小是128MB
是逐个对每一个文件进行切片
FlieInputFormat 切片过程
注意切片时,看剩余部分是否大于切片大小的1.1倍,如果不大于则不切分
CombineTextInputFormat
处理小文件的另一种方法 另一种方法在hdfs的 里的归档
- 虚拟存储 设置虚拟存储的大小
- 切片 如果大于预设值,平分切片
- 计算MapTask数据
如果大于或等于,单独形成
如果小于,则和下一个合并,再判断是否大于或大于,直到单独形成切片
例如
TextInputFormat
TextInputFormat 是默认的FileInputFormat
文件的偏移量
KeyValueTextForm
格式特别公证、
NlineInputFormat
按行切片
总行数除以N
MapReduce工作流程(重点)
shuffer 是Map阶段之后,Reduce阶段之前
在哪一步排序
在哪一步合并
- 收到待处理文件
- 客户端提交任务之前,根据参数配置,形成一个任务分配的规划(预定切片数据)
- 提交切片信息给YarnRM
- YarnRM 计算出MapTask 数量(有多少切片启动多少MapTask)
- 开始读取文件,默认是一行一行读取,Text
- Maper开始调用Map方法,处理数据,封装数据写出,写出 OutputCollertor 收集器中
- 收集器向 环形缓冲区 写入,默认大小是100M,从中间开始写,一边写索引,一边写数据。写到80%之后,向硬盘中写入数据。然后反向书写。
- 注意,一进入环形缓冲区之后,进行分区,然后对分区内的数据进行排序。分区可以自定义。排序是按 字典排序,方法是快速排序
- 溢写到磁盘上,序列化,写到磁盘上。可能有多次。
- 对于多次写入的内容,进行==归并排序 ==
- 合并成一个大的分区
ReduceTask - MRAppMaster 根据需求启动相应数量的ReduceTask,有多少分区启动多少ReduceTask
- 从每个MapTask中,copy到内存中,如果内存不够,溢写到磁盘中,然后再 进行合并文件,归并排序成一个大文件
- 一次读取一组
- 分组
- 写出
环形缓冲区
归并排序
Partition 分区
分桶操作
自定义 Partiton 分区
Combiner 合并
父类是 Reducer
和 Reducer的区别 运行位置
Combiner 是在每一个MapTask 所在的节点运行
Reducer 是接收全局所有Mapper的输出结果
意义:对于每一个MapTask 的输出进行局部汇总,以减少网络传输量
Combiner 能够应用的前提是不能影响最终的业务逻辑
统计类型的可以用
平均数类型不能用
shuffle 机制(重点)
Map之后,Reduce之前,没有严格区分
spark也有
数据压缩
概述
压缩技术能有效减少底层存储系统(HDFS)读写字节数
压缩提高了网络带宽和磁盘空间的效率
在什么情况下:数据规模很大和工作负载密集,比如、网络数据传输、shuffle和Merge
任意MR阶段都可以启用压缩
压缩能减少磁盘的I/O,但同时增加了CPU运算负担
要运用得当
压缩基本规则
- 运算密集型的job,少用压缩
- IO密集型的job,多用压缩
常见压缩格式
有取舍
Yarn 概述
Yarn 是一个资源调度平台
负责为运算程序提供服务器运算资源
相当于一个分布式的操作系统平台
MaoReduce等运算程序相当于操作系统上的应用程序
Yarn基本架构
RM 管资源
APPMaster 管理资源
Yarn 工作机制(重点)
- 把要运行的任务向所在节点提交(会生成一个YarnRunner)
- 向RM 申请一个 Application
- RM 返回一个路径和appid
- 客户端通过该路径和id,上传提交job所需资源
- 资源提交完后,向RM申请运行MRAppMaster
- RM收到请求后,先生成一个任务Task,放入一个FIFO队列中
- 当有NM时,NM领取Task
- 创建一个容器Container,有cpu+Ram+MRAppMaster
- NM会从hdfs下载job资源到本地
- 向RM申请运行MapTask容器,要启动几个MapTask
- 有空闲的MapTask后,相应数量的MapTask领取任务,创建容器,多了一个jar包
- 向MapTask发送程序,启动脚本,开始运行
- 然后申请相应数量的ReduceTask,运行
- 运行完毕后MR向RM申请注销自己
Yarn资源调度器
Hadoop 2.7.2 默认的是容量调度器 Capacity Scheduler
目前的Hadoop 作业调度器主要有三种
- FIFO
- Capacity Scheduler
- Fair Scheduler 公平调度器
容量调度器 Capacity Scheduler
按到达时间排序,先到先服务(FIFO)
支持多个队列