Spark开发-Spark内核细说

来源:互联网 发布:美国历史书籍推荐知乎 编辑:程序博客网 时间:2024/05/29 18:16

核心
1、介绍spark的内核

集群模式是Standalone的
● Driver:就是我们用来提交编写的Spark程序的一台机器,在Driver中最重要的一件事—创建SparkContext
● Application :就是我们编写的程序,类里面创建了SparkContext的程序
● spark-submit: 就是用来向Spark集群提交application的程序,spark-submit,其实说白了就是一个继承了AKKA Actor的actor模型,如果不继承的话,就无法与我们进行master进行通信,就不能向master注册我们编写的application
● SparkContext : 我们在创建SparkContext的过程中,最重要的3件事,其一创建DAGSechedule(有向无循环图调度者),其二创建TaskScheduler(任务调度者),三就是依照TaskSecheduler创建TaskSchedulerBackend(任务调度后端)
● DAGScheduler: DAG:有向无环图(Directed acyclic graph)在创建好程序之后,就会把各种算子交给DAGScheduler进行整体的一个调度,我们每一个Application在运行的时候,都会被DAGScheduler分成若干 个Stage,是由相关的划分算法来做的
● 当DAGScheduler接受到任务信息之后,就会指派相关的TaskScheduler对任务进行具体的调度,让我们taskset中的的一批task去执行具体的任务
● TaskScheduler:TaskScheduler ,就会组织,调度task进行任务执行
● 当worker中的 executor 启动之后,会主动反向注册到Driver,当driver收到所有的executor(一组executor)反向注册信息之后,就开始加载数据创建RDD ,将各种算子交给DAGScheduler管理【so 问题来了,driver是如何知道它收到了一组内所有的executor呢,大家还记不记得,Master接收到Driver的注册请求后,进行任务分配,通知各个worker进行接收任务,worker结合之后会做出回应给master任务接收到了,master会告诉driver,worker已经接收任务了,并且master此时此刻将任务分配计划,交给DRIVER,Driver按照这个分配计划,就可以知道是否一组内Executor是否已经全部到达】
● Master: Master主要用于集群的监控,运行资源的分配,Master在分配资源的时候,有两种分配方式,一种spreadapps,一种是非spreadapps,Master实际就是一个AKKA Actor的Actor模型接收到Driver发过来的注册通知,然后衡量任务,需要如何的资源,交给Worker进行干活,其实说白了就是让worker来启动executor进程
● taskRunner: 在我们的task分配过来的时候,executor会从线程池中抽取相应的task,把它给我封装成taskRunner,执行具体的flatmap , map ,reduceByKey等等操作
● 实际上,task任务分为两种,ShuffleMapTask,ResultTask,ResultTask说白了就是执行action的task,其余都是ShuffleMapTask

spark内核:
● application=driver+executor
● Driver的代码=SparkConf+SparkContext
● executor在work里面一个进程里面的处理对象。通过线程池并发执行,线程复用执行task
● application 运行过程不依赖cluster Manager
● work是管理节点,不会运行程序的代码,是管理当前节点的资源,并接受master的指令来分配
具体的计算资源executor(在新的进程中分配)
● work 不会在发送心跳的时候发送资源信息,master分配的时候就知道了资源的情况
● Job 包含一系列的task 并行计算 一般由action 触发 action不会产生RDD
● stage内部:计算逻辑一样 只是 算的数据不一样而已

为什么不能用idea集成开发环境之间发布spark程序到spark集群中
1、内存和core的限制,默认情况下spark程序的driver会在提交spark程序的机器上,所以如果是IDE中提交程序的话,那么IDE机器必须非常强大
2、driver要指挥workers的运行并频繁的发生通信,如果并发环境IDE和spark集群不在同样的一个网络下,就会出现任务丢失,运行缓慢等多种不必要的问题
3、这是不安全的

流程图:
这里写图片描述

● SparkContext连接到Master,向Master注册并申请资源(CPU Core 和Memory)
● Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源,然后在该Worker上获取资源,然后启动StandaloneExecutorBackend;
● StandaloneExecutorBackend向SparkContext注册;
● SparkContext将Applicaiton代码发送给StandaloneExecutorBackend;并且SparkContext解析Applicaiton代码,构建DAG图,并提交给DAG Scheduler分解成Stage(当碰到Action操作时,就会催生Job;每个Job中含有1个或多个Stage,Stage一般在获取外部数据和shuffle之前产生),然后以Stage(或者称为TaskSet)提交给Task Scheduler,Task Scheduler负责将Task分配到相应的Worker,最后提交给StandaloneExecutorBackend执行;
● StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成
● 所有Task完成后,SparkContext向Master注销,释放资源