公司做企业网站的哪家好,礼县建设局网站,做流量网站有收入吗,网站建设售后服务安全维护基本流程
用户编写的Spark应用程序最开始都要初始化SparkContext。
用户编写的应用程序中#xff0c;每执行一个action操作#xff0c;就会触发一个job的执行#xff0c;一个应用程序中可能会生成多个job执行。一个job如果存在宽依赖#xff0c;会将shuffle前后划分成两个…基本流程
用户编写的Spark应用程序最开始都要初始化SparkContext。
用户编写的应用程序中每执行一个action操作就会触发一个job的执行一个应用程序中可能会生成多个job执行。一个job如果存在宽依赖会将shuffle前后划分成两个stage前一个stage会将计算结果临时进行存储后一个stage则进行读取完成数据交换。
每个stage中需要执行的计算过程会被划分成多个逻辑相同的一组Task每个Task会被提交到Executor中运行。当Task运行完成后会将运行结果返回至Driver中。
主要组件
Driver端
DAGScheduler负责将Job划分为Stage再将Stage划分为TaskSetTaskScheduler负责任务的调度SchedulerBackend负责资源的分配并把Task提交给Executor中执行。
Executor端
BlockManager缓存RDD、缓存Task运行结果。 Job提交执行流程
Task提交
SparkContext将RDD的action操作转化为Job并将Job交给DAGScheduler做进一步处理。
DAGScheduler首选根据shuffle划分stage根据stage中分区的数量生成一组Task即TaskSet生成Task时还会计算Task的最佳执行位置。DAGScheduler会根据RDD是否进行了缓存来确定是否具有最佳运行位置。
DAGScheduler将Stage生成TaskSet以后会将TaskSet交给TaskScheduler进行处理TaskScheduler负责将Task提交到集群中运行并负责失败重试为DAGScheduler返回事件信息等。
当有任务提交至TaskScheduler中时TaskScheduler会通知SchedulerBackend分配计算资源。SchedulerBackend将所有可用的Executor的资源信息转换为WorkerOffer交给TaskScheduler。TaskScheduler负责根据这些WorkerOffer在相应的Executor分配TaskSet中的Task。
SchedulerBackend中通过使用Map结构记录每一个ExecutorData的映射即可管理所有Executor的CPU使用的情况。为计算任务分配计算资源时只需要遍历所有的ExecutorData分配可用的资源即可。
TaskScheduler在接受到DAGScheduler提交的TaskSet以后会为每个TaskSet创建一个TaskSetManager用于管理该TaskSet中所有任务的运行。TaskSetManager会根据Task中的最佳运行位置计算TaskSet的所有本地运行级别本地运行的级别决定了Task最终在哪个Executor中运行。Spark中本地运行级别从小到大可分为进程本地化、节点本地化、无优先位置、机架本地化、任意节点。
Task执行
Executor接收到SchedulerBackend提交的LaunchTask消息后即可运行该消息中包含的Task。Executor将接收到的Task封装到TaskRunner中TaskRunner是一个Runnable接口从而可以将该任务提交到线程池中运行。
当在一个Executor中同时运行多个Task时多个Task共享Executor中SparkEnv的所有组件共用Executor中分配的内存。如使用Spark广播变量时每个Executor中会存在一份Executor中所有的任务会共享这一份变量。当Executor中的BlockManager缓存了某rdd某分区的数据时在该Executor上调度使用这个RDD的这个分区的数据的Task执行可以有效减少网络加载数据的过程减少网络传输。
当Executor中Task运行完成时需要将Task的运行结果返回Driver程序Driver程序根据结果判断该Stage是否计算完成或者该Job是否计算完成。