spark代替了mapreduce作为新一代的计算框架,运作起来和rm大有不同
数据处理时大概需要三个部分:1.资源管理框架 2.计算框架 3.存储框架
资源管理框架大致可以有有Hadoop原装的yarn,spark自带的standalone,还有messos等等
计算框架有rm,spark
存储可用hdfs,hive,hbase等

在工作时,大致是这个所属关系(本图是以yarn为例)。
一:用户提交应用

spark App是用户提交的代码,代码分为了Drive代码和Executor执行代码。首先spark App会去yarn中的AppManager中申请一个Container去创建AppMaster实例,Drive就是运行在AppMaster之上。

得到Drive后,它会用运行main()函数且创建SparkContext,scxt也叫做spark上下文,其为运行环境做好准备,也有与资源管理者通信,申请,分配任务,监控的工作。

创建完spark上下文之后,上下文会对RDD进行处理。在对代码解析时,遇到转化类代码,不会立即执行而是记录下它的轨迹,并创建一副DAG图

在实例化上下文的同时,上下文会创建一个DAGScheduler对象,这个对象的任务是计算作业和任务的依赖,制定调度逻辑。

Job->Stage->Task都是一对多的关系,一个Job可有一个或者多个Stage,Stage也对应着多个Task,所以Stage也叫TaskSet
首先它会根据DAG图划分Stage,每个动作Actice都会生成一个Job,将Job分化为Stage的依据是什么呢?
沿着第一个操作开始,遇到窄依赖操作就加入本Stage,遇到宽依赖操作重新创建Stage。所谓的窄依赖是RDD中父RDD和子RDD是1对1或者n对1的关系,比如操作map,filtr(1->1),union(n->1)。宽依赖就是父子一对多的关系,比如bykey的系列操作(一般为shuffle操作)。

因为后面的Stage对前面的Stage结果产生了依赖,所以要等前面的Stage队列执行完后,才会进行后面的。

最后拆分完的Stage进行提交,提交时以数据集的方式提交。DAGScheduler上交给TaskScheduler后,TaskScheduler会创建一个TaskManager的实例去监管这个任务集。TaskManager的具体实现是在计算资源的时候,它会通过进一步调度让任务执行在Execute上。一个TaskManager管理一个TaskSet
此时DAGScheduler的任务还没有完成,它还要监控作业的顺利调度和成功执行。它也会监控Execute的生命状态,如果一个Execute崩溃,会将shuffleMapTask的结果标为不可用,这将导致对应任务集状态的变更,进而重新执行相关计算任务,以获取丢失的相关数据。
在spark中,Task的类型分为2种:ShuffleMapTask和ResultTask;
简单来说,DAG的最后一个阶段会为每个结果的partition生成一个ResultTask,即每个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的!而其余所有阶段都会生成ShuffleMapTask;之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中;也就是说上图中的stage1和stage2相当于mapreduce中的Mapper,而ResultTask所代表的stage3就相当于mapreduce中的reducer。
结果集得出后,经过Task处理后分为DirectTaskResult与IndirectTaskResult两种结果。如果数据量小,直接将结果装到DirectTaskResult中返回给DAGScheduler。如果结果数量庞大,先将结果序列化再作为一个数据块存到BlockManager(每个节点上的存储对象)。然后会返回一个BlockID给TaskScheduler,再通过TaskScheduler传给DAGScheduler。



参考:http://www.raincent.com/content-85-11052-1.html
网友评论