13mapreduce的分发&启动&job的提交——好程序

mapreduce是什么
分布式离线计算框架,是分布式运算程序的编程模型,是用户基于hadoop的数据分析应用的核心框架,mapreduce的核心功能是将用户编写的业务逻辑代码和自带的默认的 组件整合到一个完整的分布式运算程序,并运行在hadoop集群上。

hdfs:将大的文件切分成若干个小的文件,然后将他们分别存储到集群中的不同节点上。
mapreduce:是将一个复杂的运算切分成若干个子运算,然后将他们分别提交给集群中不同的节点来进行运算。

MapReduce的原理

分布式计算框架所面临的问题(分发与启动)

一般的思路,单个统计——可以先一行一行读取数据,通过空格进行切分,形成数组,再循环迭代,再用一个map去查如果有的话则数量就加一,最后得出的结果就算出来了。


分布式思路,海量统计——MapReduce是将大的计算拆成小的计算,从存储上来说也是一样的。
第一步在各个节点上是分成一个个小块进行存储,如果将计算的程序,也放到这些机器上来,就可以在机器上直接读取文件和计算,有多少个块,放多少个计算程序,每个计算程序是很小的,计算里面占用的空间是很小的,从计算来说是可以解决的,不会存在所谓的内存溢出问题,对于每一个块来说都是这种逻辑,将机器里面的每一个块里面总的数量都统计完了。
第二步,还要实现一个业务逻辑,将所有块的统计结果挪到一起来,合并的操作也是可以并行跑的

==================

1、客户端要有一个程序,进行提交(需要一个提交task程序)
2、如何将wc.jar分发到集群里面呢?还有DataNode要实现什么功能将数据接下来?
   每台都可以设置一个组件worker:组件里有一个sokert进行接收数据,这样就实现分发的功能
3、那么如何启动:收到jar包了,就可以询问回客户端一个消息,程序拿到了,该如何启动
   客户端就将启动的命令发送给组件worker,每一个worker都发一个命令 就是一个Java的启动命令
   java -cp  ****,worker拿到命令,直接启动就可以了。
 

另一个架构——job的提交流程

分块由客户端完成,分片也是由客户端完成。


 (将计算节点被动的接收分发形式变成了主动去获取资源)
wc.jar包含了里面这些东西,真正的提交是myClient的驱动程序 ,然后提交Java -cp wc.jar myClient
的驱动程序,现在需要将任务分到机器上来,现在先解决一个任务,分发到机器,不可能jar都通过客户端去做分发,最好的方法是先提交到一个中转站,所有的计算节点,需要分配到任务的时候,直接去中转站去拿就可以了,对于存放jar包的可以先存放在HDFS分布式存储系统。
然后,需要考虑分配问题,同时需要实现计算功能,对于客户端提交的任务,到底是由谁来执行呢,解决不了,则加一层,用于管理资源和分配资源ResourceManager,而被分配的机器就是NodeManager。
客户端提交的东西,先提交给resourceManager,(先生成一个jobid,进入到调度队列,因为yarn集群不是为一个作业服务的,而是很多服务,是需要排队等待的,和一个文件的存放路径path,将生成的数据返回给客户端,路径有了,)
3、客户端就将资源按着路径进行上传给HDFS,上传完之后,报告给resourcemanager
4、客户端汇报资源上传成功。此时,会真正的将资源放到等待队列来了(之前是等待你上传完数据),调度队列是有两一个线程来调度的。
5、ResourceManager在启动之前先分配一个资源,如分配node1,
6、node1则需要到HDFS上面去拉去一个wc.jar资源,但是还不知道如何启动,所以
7、询问客户端,应用程序该如何启动
8、返回启动命令java -cp wc.jar myClient****
9、拿到了启动命令,则node1就需要启动appMaster,
10、appMaster就需要向ResourceManager申请资源,申请maptask(而且有一个调度顺序问题,先调度maptask,好调度reducetask)
11、ResourceManager按appMaster申请进行分配资源(按需分配),分配完后计算节点就要做计算。
--------任务已经分好了,则被分配的机器要去获取资源进行计算工作-----------
12、计算节点要多HDFS上去拉去资源,拉去后落地到磁盘,然后如何启动任务呢?
所有的任务都是由master去调度的,它是知道maptask,reducetask是如何启动的,所以。(也能拉去split切片后的数据,拉取下来后,就知道需要多少个task,因为客户端已经切好了)
13、wc.jar需要向appMaster发送一个申请启动命令,同时计算直接在container上面进行计算,同时container是要向appmaster汇报执行的情况,他们是可以建立连接的。
第一个节点maptask执行完了,则reducetask就可以启动,因为需要将每一个maptask的数据到节点上来,做准备工作,当所有map执行完了,reduce也拉完数据了。
分配了三台机器,节点怎么知道它分配了什么任务,只有ResourceManager知道,不知道任务,怎么去拉去资源呢?
采用心跳机制,三秒钟发送一个心跳,Resourcemanager可以写一个函数,会将需要的分配的资源列表放到资源队列中,node*去读队列信息,直接读子节点,拿到了任务,将任务列表返回给你(小弟主动报告,老大将资源列表放到等待队列,直接读取对应的节点信息返回给小弟)
如何去确定,需要多少个资源呢?
task到底是如何来分的,是由客户端程序来分的,决定要多大的并行度,
map阶段的并行度如何去计算,如何去分配,
客户端先看一下待处理目录下面的数据量    /data/aaa
如何去决定并行度呢,是先循环变量每一个文件,并看看文件有多少块block,
然后将块的数量累加起来,就得到了一个文件的数据量
累加完后,需要返回一个任务列表的描述文件,将任务列表写到文件中去,job.split任务的切片。

这是客户端能够决定的
 

发布了204 篇原创文章 · 获赞 16 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/penghao_1/article/details/104417202