大家好,我是风云,欢迎大家关注我的博客 或者 微信公众号【笑看风云路】,在未来的日子里我们一起来学习大数据相关的技术,一起努力奋斗,遇见更好的自己!
前言
只有理解了MapReduce的核心思想以及体系结构,我们才能更好的进行MR编程!
MapReduce核心思想
核心思想:分而治之。
一个存储在分布式文件系统HDFS中的大规模数据集,会被切分成许多独立的分片(split)即:
一个大任务分成多个小的子任务(map),由多个节点进行并行执行,并行执行后,合并结果(reduce)
函数 | 输入 | 输出 | 说明 |
Map | <k1,v1> 如: <行号,“a b c”> |
List(<k2,v2>) 如: <"a",1> <"b",1> <"c",1> |
1. 将小数据集进一步解析成一批<key,value>对,输入Map函数中进行处理 2. 每一个输入的<k1,v1>会输出一批<k2,v2>。<k2,v2>是计算的中间结果 |
Reduce | <k2,List(v2)> 如: <"a",<1,1,1>> |
<k3,v3> <"a",3> |
输入的中间结果<k2,List(v2)>中的List(v2)表示是一批属于同一个k2的value |
- 分布式编程架构
- 以数据为中心,更看重吞吐量
- 分而治之的思想
- Map将一个任务分解成多个子任务
- Reduce将多个子任务的计算结果汇总
Mapreduce体系结构
- Job
- 一个任务,一个作业
- 一个Job会被分成多个Task
- Task
- task里面,又分为Maptask和Reducetask,也就是一个Map任务和Reduce任务
- JobTracker & TaskTracker
- MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave
- Master上运行JobTracker,负责作业的调度、处理和失败后的恢复
- Slave上运行的TaskTracker,负责接收JobTracker发给它的作业指令
Hadoop框架是用Java实现的,但是,MapReduce应用程序不一定要用Java来写,也可以用python
JobTracker:
- 作业调度
- 分配任务、监控任务执行进度
- 监控TaskTracker的状态
TaskTracker的角色:
- 执行任务
- 汇报任务状态
MapReduce体系结构主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task
Client:客户端,用于提交作业
JobTracker:作业跟踪器,负责作业调度,作业执行,作业失败后恢复
TaskScheduler:任务调度器,负责任务调度
TaskTracker:任务跟踪器,负责任务管理(启动任务,杀死任务等)
- Client-提交作业,查看作业状态
**提交作业:**用户编写的MapReduce程序通过Client提交到JobTracker端
**查看作业状态:**用户可通过Client提供的一些接口查看作业运行状态 - JobTracker-资源监控、作业调度
JobTracker负责资源监控和作业调度
资源监控: JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现节点失效(通信失败或节点故障),就将相应的任务转移到其他节点
作业调度: JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而任务调度器会选择合适的(比较空闲)节点资源来执行任务 - TaskScheduler-任务调度器
- TaskTracker-任务管理
TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器(TaskScheduler)的作用就是将各个TaskTracker上的空闲slot分配给Task使用。
slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用 - Task
Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动