MapReduce-分布式计算引擎
2018-09-16 本文已影响61人
一个喜欢烧砖的人
MepReduce背景
- 来源于google的mepreduce克隆版
mepreduce的特点
- 易于编程
- 良好的扩展性
- 高容错性
- 适合pb级以上的海量数据的离线处理
mepreduce应用场景
- 简单的搜索统计
- 搜索引擎建立索引(mepreduce的初衷)
- 海量数据的查找
- 复杂数据的算法分析(聚类算法、分类算法、推荐算法、图算法等)
mepreduce的缺点
- 实时计算
- 流式计算
- DAG计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个应用程序的输出
mepreduce的编程模型(基于wordcount)
image.png- input
输入一大部分文件,什么都有 - splitting
分片,任务是把一堆任务切成小文件
大任务切成小任务
输入是一堆小文件 - mapping
splitting的小文件每片都交给一个map来处理
输入是一个key-value的键值对 - shuffling(混洗)
1、对map后的数据进行混洗
2、对相同的key进行合并(把key相同的发送给同一个节点)
3、混洗的依据是key的哈希对reduce的个数的模
4、取完模后还会进行排序(排序后会使相同的key集中起来,这样以便后续操作) - reducer
对key的value进行统计,就可以输出结果了
reducer的数量用户自定义 - result
结果输出
mepreduce的作业运行流程-wordcount
mapreduce将作业的整个运行过程分为两个阶段
- map阶段
map阶段由一定数量的map task组成(一个map task可以理解为一个进程)
1、inputFormat(用户指定)
2、mapper(用户指定逻辑)
3、partition(用户指定) - reduce阶段
1、数据远程拷贝
2、数据按照key排序
3、数据处理(用户指定)
4、数据输出格式(用户指定)
不过map和reduce用户指定 其他的mepreduce有默认设置,可以自己去自定义
mepeduce的编程模型(数据流向)
image.png- hdfs上的数据根据block为一个块
- 每个split的数据块交由mapper来处理
- partition 负责将每个mapper的结果输出到各自的reduce中,partition根据key的hash取reduce数量的模来计算,patition进行分片分开执行并输出本地磁盘,mapper可能在不同的机器上执行,数据输出在本地磁盘,partition还会进行排序(归并排序),mapper阶段完成
- 接下里就是reduce阶段,
- reduce开始就先去取各个mapper上的数据,对mapper完成后的partition的数据进行拉取(比如一个mapper机器上同时有好几个partition执行的分片,reduce1只要编号为1的分片)--其实这就是shuffle混洗过程
- 接下来就开始shuffle排序过程
- 接下来就是output输出
- 结束
mepreduce 优化
- combiner
1、其实可以发现在mapper阶段也是可以进行排序来优化的,在mapper输出的时候进行一个局部合并(这个过程称为combiner,通常和reduce的过程是一样的)
2、合并之后,mapper端的数据量减少,处理起来就会变快
3、注意combiner的逻辑的可执行型,比如求平均值就不能用,用个数之和就能使用 - paritioner
1、parititioner决定了mapper的结果由哪一个reduce处理
2、这个分区的过程可以自己处理(根据ip,域名都是可以的)
mepreduce的架构(在yarn基础上)
image.png过程:
1、client向yarn提交mepreduce任务(直接指向的是resourceManager)
2、resourceManage找一台空闲的nodeManager,
3、在这台nodeMenage来启动appMaster
4、appMaster会向resourceManage申请资源
5、appMaster申请到资源后会向nodeManager分配任务,并启动起来
存在问题:
- appMaster失败
如果appMaster出现失败,yarn的resourceManage会自动重新启动,启动几次(由用户指定)如果还是失败,则作业启动失败 - map或者reduce失败
task周期性的向appMaster定时心跳,一旦挂掉,就会重启,重启固定次数后还是怪调,就会重新申请资源