MapReduce框架学习笔记

这篇文章是学习过林子雨老师的视频课程后自己对MapReduce的总结和笔记。

MapReduce

MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理。

MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为,移动数据需要大量的网络传输开销(理想的情况是:map任务和要出来的数据块在一个节点上,不需要数据迁移)。

Map和Reduce

MapReduce的主要组成:

1)Client
用户编写的MapReduce程序通过Client提交到JobTracker端
用户可通过Client提供的一些接口查看作业运行状态
2)JobTracker
obTracker负责资源监控和作业调度
JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源
3)TaskTracker
TaskTracker会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
TaskTracker使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供MapTask和Reduce Task使用
4)Task
Task分为Map Task和Reduce Task两种,均由TaskTracker启动



MapReduce的工作流程

不同的Map任务之间不会进行通信
不同的Reduce任务之间也不会发生任何信息交换
用户不能显式地从一台机器向另一台机器发送消息

所有的数据交换都是通过MapReduce框架自身去实现的

Split

HDFS以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理单位是split。split是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。



Shuffle过程简介


Map端的shuffle过程

每个Map任务分配一个缓存
MapReduce默认100MB缓存

设置溢写比例0.8
分区默认采用哈希函数
排序是默认的操作
排序后可以合并(Combine)
合并不能改变最终结果

在Map任务全部结束之前进行归并
归并得到一个大的文件,放在本地磁盘
文件归并时,如果溢写文件数量大于预定值(默认是3)则可以再次启动Combiner,少于3不需要
JobTracker会一直监测Map任务的执行,并通知Reduce任务来领取数据


合并(Combine)和归并(Merge)的区别:
两个键值对<“a”,1>和<“a”,1>,如果合并,会得到<“a”,2>,如果归并,会得到<“a”,<1,1>>


Reduce端的shuffle过程

Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘
多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的
当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce



MapReduce程序的执行过程




1)程序部署
把程序分发到不同的机器上面,选择一个机器作为Master(管家的角色),选择一些机器作为Worker,然后把相应的程序分发给这些机器,就完成了程序部署。
2)分配map任务和reduce任务
现在已经拥有若干Worker,然后就需要选择一部分机器做map任务,选择一部分做reduce任务。需要运行map任务,所以需要输入数据,mapreduce的输入一般都是很大的文件,所以需要对一个大的数据集进行分片。选择map机器中空闲的几个来完成数据分片。
3)读数据
从HDFS各个分片中读入数据,输入以后生成相关的键值对<key,value>提交给map任务去执行(map里面有用户处理数据的逻辑),处理完成后输出的数据也是键值对<key,value>形式。输出的结果先写入缓存。
4)本地写数据
当缓存中的数据写满之后,需要溢写到磁盘。所以要把缓存中的数据进行分区、排序、可能发生的合并操作,然后写入磁盘,写入磁盘的文件是一个大的文件,这个文件就包括了很多的分区。这些数据都是合并、排序以后的数据。最后这些数据要发送给reduce机器。
5)远程读数据
负责执行reduce任务相关的机器会从各个相关的map任务的所在机器中取走属于自己处理的数据,取回到reduce本地,然后就是执行用户定义的reduce过程,完成数据处理,出来的结果也是键值对<key,value>的形式。
6)写数据
把这些相关的结果写入到输出文件中,这个输出文件就是HDFS。
注:输入时从HDFS提取数据,输出也是写入到HDFS中。但是所有的中间结果都是不写入HDFS的,例如map的输出是写入map机器的磁盘,而不是写入到HDFS。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值