mapreduce框架讲解

6 篇文章 0 订阅
2 篇文章 0 订阅

mapreduce

#hadoop/mapreduce
MapReduce将复杂的,运行于大规模集群上的并行计算过程高度的抽象到了两个函数:map和reduce
编程变得容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算
MapReduce采用分而治之的策略,一个储存在分布式文件系统中的大规模数据集,会被切分为许多独立的分片(split),这些分片可以被多个map任务并行处理
MapReduce设计理念就是计算向数据靠拢,而不是数据向计算靠拢,因为移动数据需要大量的网络传输开销
MapReduce框架采用了Master和slave架构,包括一个Master和若干个slave。Master上运行jobTracker,slave上运行TaskTracker
Hadoop使用Java实现的,但是MapReduce应用程序不一定要用Java来写

  1. 海量数据在单机上处理因为硬件资源限制,无法胜任
  2. 而一旦将单机版程序扩展到集群分布式来运行,将极大增加程序的复杂度和开发难度
  3. 引入MapReduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理
    自己写一个分布式的矿建

::需求::

统计大量的文本文件中的单词出现的次数

实现:hashmap key:单词 value:次数

  1. 程序放到哪个上面去运行?
  2. client如何将程序jar包放入DataNode?
  3. 如何让DataNode运行这个jar包?
  4. 程序如何读取这个block数据?
  5. Block有多个副本,如果直接去运行,那就是读了副本的个数?
  6. 如何排除重复?
  7. 是集群中所有的DataNode都要运行这个程序吗?造成资源的浪费。。
  8. 如何分配运行程序的DataNode个数?
    数据统计的分配工作,最后将结果做累加

mr的简单框架:

  1. 整个运算过程需要分为两个阶段,不同的阶段需要开发不同的程序
    阶段一:并行局部运算 :逻辑分片处理
    阶段二:结果的汇总
    汇总是否能并行执行?
    分配多个机器做汇总工作,并行处理是可以的
  2. 阶段之间的调度(两块是否并行完成,还是一个一个完成)yarn
  3. 业务程序(task)如何分发到集群,如何启动(job)
  4. 如何监控task程序的运行状态,如何处理异常
    这些问题是开发分布式程序会面临的问题,完全可以把这些封装成框架:mapredeuce

客户端程序:用来提交task程序
编辑程序并达成包 如:wc.jar

  1. 客户端程序拿到jar包,封装成一个资源
  2. 提交这个jar包到DataNode(启动socket client发送)
  3. DataNode都有一个进程 假如为:worker(socket server)来收集资源
  4. 接受完毕之后,向worker返回一个状态,告知client已经接受完毕
  5. 由客户端来启动DataNode中de wc.jar,发送一个命令给worker来启动

mr 的复杂框架

Java -cp wc.jar Myclient
(封装)wc.jar:
myclient:负责启动MapReduce,设置任务的属性等
appMater(主管):负责调度
两个阶段

  1. maptask(实现wcmapper.map())、
  2. reducetask(实现wcreducer.reduce())
    客户端提交运行:收集起来
    如何分发:将jar放到HDFS上去 /jobs/jobid/wc.jar
    使得所有机器都可以去HDFS去取资源
    怎么调度恰当的DataNode个数:Master:resourcemanager
    datanode中的Worker:nodemanager

流程(job提交):

  1. 客户端提交任务(job)到rm resourceManager会将Job放入等待队列中
  2. 返回jobID,返回path
  3. 客户端将资源上传到HDFS中的存放目录中
  4. 分配 一个资源到nodemanager ,nodemanager 去HDFS上将wc.jar 拿下来
    拿到jar包之后向client发送消息
    客户端发命令给nodemanager
  5. ~发送一个命令给nodemanager ,nodemanager启动一个appMater(负责阶段间的调度)向resourceManager发送请求(其中申请多少maptask,是client客户端给的),申请内存~
  6. 计算的时候做数据分片(逻辑概念),将task分了一个待处理的范围(如处理0-100 偏移量和数据长度)
  7. nodemanager 怎么到获取任务?job会把需要参与的节点记录到描述信息里面
    nodemanager发送心跳,查询自己分配到的任务 resourManager返回任务列表
  8. 分配到待处理任务的列表的worker,去HDFS上将jar包拿出来
  9. 由谁启动maptask任务? appMaster向worker发送命令 附带待处理数据的路径
  10. 客户端程序确定需要多大的并行度
    map阶段的并行度的计算:
    客户端首先看一下待处理数据目录下的数据量
    循环遍历:对每个文件来做
    看文件有多少block
    将block数量累加到计数器
    返回一个任务规划描述文件:切片的大小
    appmaster 解析分片
    job.split
    Split0 : /data/a.txt 0-128
    Split1::/data/a.txt 128-256
    Split8:……
  11. 将切片文件放到HDFS中
  12. appmaster 发送命令来让worker启动
    reducetask和maptask可以并行运算
    appMaster监控状态信息,只要处理完一个片就反馈一个信息到reduceMaster
  13. reduceMaster收集所有数据,开始计算

input (输入)
split(拆分)
Map(映射)
shuffle(派发)
reduce(缩减)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值