【大数据技术原理】MapReduce详解

本文主要针对MapReduce1.0相关概念进行介绍,主要参考厦大林子雨教授的mooc,结合自己理解总结成文。


简介

MapReduce是一种分布式并行编程框架,支持横向扩展的数据处理能力。

Hadoop MapReduce是分布式应用程序Hadoop的核心数据处理组件,是google提出的MapReduce的开源实现。

背景

数据处理能力的增长方式有二:

  1. 纵向扩展,即提高内存、性能,单核->双核->多核;
  2. 横向扩展,使用分布式并行编程,借助一个集群通过多台机器同时并行处理大规模数据。

运算能力方面,由于制作工艺受限,单位面积上的晶体管数量具有上限,过度集成会导致热效应、磁场效应影响增大,所以CPU性能增长摩尔定律从05年开始逐渐失效。

但是在数据方面,数据量却依然保持着每两年翻一番的速度高速增长。

这种数据量和处理能力的不均衡发展使得运算的纵向扩展(提高内存、性能)受到限制,横向扩展的方法变得重要起来。

比较

MapReduce出现之前,就已经有了很多经典的并行编程框架,如MPI(消息传递接口)、OpenCL(为异构平台编写程序的框架)、CUDA(Compute Unified Device Architecture,统一计算架构)。

传统并行编程框架与MapReduce区别:

  • 集群架构
    • 前者采用性能计算模型HPC,共享式架构(内存、存储),底层采用统一的存储区域网络SAN
    • 后者采用典型的非共享式架构
  • 容错性
    • 前者任何硬件故障都容易导致集群不可工作
    • 后者分布式任何节点出问题都不会影响其他节点正常运行,且有冗余和容错机制
  • 硬件
    • 前者:昂贵,刀片服务器+高速网络+存储区域网络SAN
    • 后者:廉价PC机做计存节点
  • 扩展性
    • 前者共享式集群架构,扩展性差
    • 后者整个集群可以任意增减相关计算节点,扩展性好
  • 编程学习难度
    • 前者难度高,和多线程编程逻辑累死,需借助互斥量信号锁等机制,要实现不同任务间同步
    • 后者难度低,自动分布式部署,核心是编程设计Map和Reduce函数
  • 实用场景
    • 前者:计算密集型应用,实时细粒度计算
    • 后者:数据密集型应用,非实时批处理

模型

模型策略

MapReduce采用分而治之的方法,将庞大的数据集切分成非常多独立的小分片,分别启动map任务,在多个机器上处理

模型理念

计算向数据靠拢,而不是数据向计算靠拢

模型架构

Master/slave架构

  • 一个master架构
    • 作业跟踪器JobTracker:负责作业调度和处理、失败和恢复
  • 若干个slave服务器
    • 具体任务执行组件TaskTracker:负责接收JobTracker的作业处理指令,完成任务处理

Map和Reduce函数

  • Map函数
    • 输入<k1,v1>,输出List(<k2,v2>),其中<k2,v2>是计算中间结果
    • 例:<行号,‘a b c’> <‘a’,1><‘b’,1><‘b’,1>
  • Reduce函数
    • 输入<k2,List(v2)>,输出<k3,v3>,其中List(v2)是同一批属于同个k2的值列表
    • 例:<‘a’,(1,1,1)> <‘a’,3>
      在这里插入图片描述

体系结构

组件介绍:

  • Client
    • 提交用户应用程序,交到JobTracker
    • 查看提交作业运行状态
  • 作业跟踪器JobTracker
    • 资源监控&作业调度
    • 监控TaskTracker和Job的健康状况
    • 探测到失败任务转移
  • 任务调度器TaskTracker
    • 执行JobTracker传过来的任务运行指令
    • 资源使用情况&任务运行进度通过HeartBeat传给JobTracker
  • 资源单位slot
    • map slot & reduce slot

工作流程

过程拆解

概览

在这里插入图片描述

  1. Map任务从HDFS读取数据进行分片处理
  2. 将分片的内容通过map函数解析成kv对缓存在内存中
  3. 缓存满后会发生溢写,通过分区、排序、可能有的合并操作,将结果归并写入磁盘
  4. Shuffle:Reduce任务将属于自己处理对象的分区文件内容取走
  5. Reduce任务先将来自同一分区逻辑多个磁盘文件进行归并
  6. 通过reduce函数将kv对列表进行处理,输出写入HDFS

注:文件合并是可能会有的combine函数,用于减少map端文件大小,例如计数会将<k1,1>和<k1,1>合并成<k1,2>

shuffle

shuffle的目的是按照partition、key对中间结果进行排序合并,输出给reduce线程
目标:

  • 完整地从map task端拉取数据到Reduce端
  • 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗
  • 减少磁盘IO对task执行的影响

Map shuffle:
在这里插入图片描述
Reduce端Shuffle:
在这里插入图片描述

注意点

  1. 一般分片大小一般等于block大小,来最大化性能
    在这里插入图片描述
  2. 最优Reduce任务数量取决于集群可用reduce slot数量,但通常设置小一些以防错误

应用程序执行流程

在这里插入图片描述

实例:wordCount

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值