zoukankan      html  css  js  c++  java
  • Task级别任务调度分析---源码级

    1.Driver和SparkContext

    先有的driver,在driver中创建的sparkcontext。

    运行应用程序的main函数,启动一个Driver进程。功能如下:

    • 创建spark的sparkcontext上下文
    • 划分RDD并生成有向无环图(DAG)
    • 与spark中的其他组件进行协调,协调资源等等(SchedulerBackend)
    • 生成并发送task到executor(taskScheduler)

    Driver负责和ClusterManager通信,进行资源的申请、任务的分配和监控等。

    Driver(驱动程序):Spark中的Driver即运行上述Application的main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责与ClusterManager集群管理器进行通信,进行资源的申请,任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。

    2.Task级别的调度

    spark是粗粒度资源申请,application启动之前首先将所有的资源申请完毕,如果申请不到一直处于等待状态,一直到资源申请到为止。必须一次申请完毕之后,才会执行任务,这样,task执行的时候,task不需要自己申请资源,加快了task的执行效率,task快了,job就快了,job快,application执行就快了。必须最后一个task执行完毕之后,才会释放所有资源。

    • 调用TaskScheduler.submitTask(taskSet, ...)方法,TaskScheduler本身是个接口,spark里只实现了一个TaskSchedulerImpl。调用TaskSchedulerImpl.submitTask(taskSet, ...)接收DAGScheduler提交来的tasks ,分析stage里Task的类型,生成一个Task描述,即TaskSet。
    • 调用TaskSchedulerImpl.TaskSetManager(taskSet, ...)为tasks创建一个TaskSetManager,添加到任务队列里。TaskSetManager跟踪每个task的执行状况,维护了task的许多具体信息。
    • SchedulerBackend在TaskScheduler下层,用于对接不同的资源管理系统,SchedulerBackend是个接口,实现类是CoarseGrainedSchedulerBackend。通过SchedulerBackend.reviveOffers给driverEndpoint发送ReviveOffer消息。reviveOffers()方法的实现。就是别人直接向SchedulerBackend请求资源, 直接调用了makeOffers()方法,SchedulerBackend把node节点上可用资源交给TaskScheduler,TaskScheduler根据调度策略为排队的任务分配合理的cpu和内存资源,返回一批可执行的任务描述。
    • SchedulerBackend.launchTask,把任务序列化,将序列化的任务发送给executor。
    • executor.receive()把任务进行反序列化,利用创建好的executor对象执行任务。
    • executor.launchTask()把task塞到了executor线程池上,executor里的线程池会执行task的run()
      源码分析如下:

      spark任务调度流程图如下:

      TaskSetManager结构如下:
  • 相关阅读:
    Educational Codeforces Round 104 (Rated for Div. 2) A B C D E
    Codeforces Round #701 (Div. 2) A B C D
    Codeforces Round #700 (Div. 2) A B C D1
    记录一次Boot整合Batch框架无法连接达梦数据库的问题
    关于Java中的volatile关键字的总结,适合了解不太多的人
    写个日志切面追踪,可以更直接查看项目执行的各种信息打印。
    sqlServer实现group by 之后 聚合操作之拼接结果
    SQL CURSOR 游标
    SQL case when
    Redis版本
  • 原文地址:https://www.cnblogs.com/wanpi/p/14616748.html
Copyright © 2011-2022 走看看